【问题标题】:perl file size calculation not workingperl 文件大小计算不起作用
【发布时间】:2012-11-28 09:09:14
【问题描述】:

我正在尝试编写一个简单的 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 _ 的正确方法感到困惑。我很感激你的指导。谢谢!

【问题讨论】:

    标签: perl permissions filesize


    【解决方案1】:

    如果这不仅仅是您的拼写错误-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 以更简单的方式访问文件名和属性的方式。

    【讨论】:

    • 谢谢,莫里茨!就是这样。我输入了完整的路径和宾果游戏,它奏效了。我还要看看 IO::dir,谢谢指点。
    • 另外,我更正了代码示例以删除错字并将-s _ 替换为-s $_。我在实际代码中是正确的。
    【解决方案2】:

    你有一个错字:

    $cursize = -s _;
    

    应该是:

    $cursize = -s $_;
    

    【讨论】:

    • 也许不是,但仅供参考:-s _ 或 -r _ 之类的语句永远不会正确,因为 _ 不是变量。
    • 感谢 ElPaco。我很困惑:我正在看 James Lee(第 3 版)的这本书 Beginning Perl,在第 220 页他有:while ($_ = readdir (DH)) { print -s _ if -r and -f ; },他在上一页中说“_ 是 perl 文件测试的默认文件句柄。”我不明白他的例子中的用法和我在这里做的事情之间的区别。你能帮我弄清楚吗?抱歉太密集了。
    • print -s _ if -r and -f 之所以有效,是因为-r 和-f 在-s _ 之前执行,并且默认应用于$_。这样说看起来有点混乱。
    • @ElPaco 不,我也找不到任何东西,除了 perldoc -f "-X" 中的松散参考
    • @verbose, @ElPaco _ 重用最新的统计数据($file)。执行文件元数据查询非常昂贵,因此 Perl 会缓存信息,就像您通常对同一个文件进行多次测试一样。
    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多