我正在寻找一个小脚本,它会告诉我一个文件是否是空文件,但我无法显示这一点。我使用了下面的代码:
opendir DIR,$directory ; while (my $dir =readdir DIR) { if (-s "$dir") { print "This is an empty file"; } }
这里我无法打印“这是一个空文件”,而且我的代码没有进入if循环。有人能告诉我上面的代码出了什么问题吗?
6jygbczu1#
相关的file test operators为:
您正在检查$dir是否为非空,因此与您尝试实现的相反。请使用-z(或!-s)代替。此外,每个$dir只是文件名,没有路径,因此如果不处理当前目录,则需要自己包含它。
$dir
-z
!-s
if (-z "$directory/$dir") { print "This is an empty file"; }
z9gpfhce2#
主要的问题是readdir()并没有返回您所认为的内容,它返回的是目录中文件的名称,但是您返回的名称并没有附加目录路径,而且-s操作符需要文件的完整路径才能找到它。所以你需要自己附加目录名。类似这样的操作就可以了:
readdir()
-s
opendir DIR, $directory ; while (my $dir = readdir DIR) { # Note: Full path here. if (-s "$directory/$dir") { print "This is an empty file"; } }
但是还有一些其他的问题需要解决,首先-s返回文件的大小,对于非空文件也是如此,这意味着你的逻辑是相反的,实际上应该是这样的:
if (-s "$directory/$dir") { print "This is a non-empty file"; } else { print "This is an empty file"; }
同样值得注意的是,使用bareword目录句柄并不是一个好主意,使用词法变量作为句柄要好得多,我将这样编写代码:
opendir my $dir_h, $directory ; while (my $file = readdir $dir_h) { # Note: Full path here. if (-s "$directory/$file") { print "This is a non-empty file"; } else { print "This is an empty file"; } }
哦,我还偷偷地改了一个变量名。$file似乎是一个比$dir好得多的名字:-)
$file
2条答案
按热度按时间6jygbczu1#
相关的file test operators为:
您正在检查
$dir
是否为非空,因此与您尝试实现的相反。请使用-z
(或!-s
)代替。此外,每个
$dir
只是文件名,没有路径,因此如果不处理当前目录,则需要自己包含它。z9gpfhce2#
主要的问题是
readdir()
并没有返回您所认为的内容,它返回的是目录中文件的名称,但是您返回的名称并没有附加目录路径,而且-s
操作符需要文件的完整路径才能找到它。所以你需要自己附加目录名。类似这样的操作就可以了:
但是还有一些其他的问题需要解决,首先
-s
返回文件的大小,对于非空文件也是如此,这意味着你的逻辑是相反的,实际上应该是这样的:同样值得注意的是,使用bareword目录句柄并不是一个好主意,使用词法变量作为句柄要好得多,我将这样编写代码:
哦,我还偷偷地改了一个变量名。
$file
似乎是一个比$dir
好得多的名字:-)