2

我正在尝试编写一个简单的 perl 脚本,它将遍历目录中的常规文件并计算所有文件放在一起的总大小。但是,我无法获得文件的实际大小,我不知道为什么。这是代码的相关部分。我输入了打印语句进行调试:

$totalsize = 0;
while ($_ = readdir (DH)) {
   print "current file is: $_\t";
   $cursize = -s $_;           
   print "size is: $cursize\n";
   $totalsize += $cursize;
}  

这是我得到的输出:

current file is: test.pl    size is: 
current file is: prob12.pl  size is: 
current file is: prob13.pl  size is: 
current file is: prob14.pl  size is: 
current file is: prob15.pl  size is: 

所以文件大小保持空白。我尝试使用$cursize = $_,但唯一的效果是检索当前目录和父目录的文件大小,每个文件大小为 4096 字节;它仍然没有得到任何常规文件的实际文件大小。

我在网上看了几本关于 perl 的书,似乎 perl 无法获取文件大小,因为脚本无法读取文件。我通过放入一个 if 语句来测试这个:

print "Cannot read file $_\n" if (! -r _);

果然对于每个文件,我都收到错误消息,指出无法读取该文件。我不明白为什么会这样。包含相关文件的目录是我的主目录的子目录,我正在以我自己的身份从我的主目录中的另一个子目录运行脚本。我已读取所有相关文件的权限。我尝试将文件的模式更改为 755(从之前的 711),但我仍然得到Cannot read file每个文件的输出。

我不明白发生了什么事。要么我对运行 perl 脚本时权限的工作方式感到困惑,要么对正确使用-s _. 我很感激你的指导。谢谢!

4

2 回答 2

11

如果这不仅仅是你的错字-s _而不是正确的,-s $_那么请记住,它readdir返回的文件名相对于你打开的目录opendir。正确的方法是

my $base_dir = '/path/to/somewhere';
opendir DH, $base_dir or die;
while ($_ = readdir DH) {
  print "size of $_: " . (-s "$base_dir/$_") . "\n";
}
closedir DH;

您还可以查看核心模块IO::Dir,它提供了tie一种以更简单的方式访问文件名和属性的方法。

于 2012-11-28T09:20:45.763 回答
0

你有一个错字:

$cursize = -s _;

应该:

$cursize = -s $_;
于 2012-11-28T09:15:29.160 回答