使用stat在Perl中获取未初始化的变量

时间:2013-06-14 22:39:43

标签: perl portability epoch stat initialization

我正在编写一个显示现有文件年龄的脚本,然后在大约4个小时后自动将其删除(假设维护窗口)。我一直在尝试使用Perl中的stat函数测试我的输出。我们有多个盒子,一些运行Linux和Solaris,所以这是最便携的方式。我想要获得纪元时间。

use File::stat;
$file  = "samplefile"; 
$mtime = (stat($file))[9];
if (!defined $file){
    print "No file specified\n";
    exit 1; 
}
printf("%d", @mtime);

我知道stat()会返回@_,所以我尝试将我的数据类型更改为此。但它一直回来说mtime尚未初始化。为什么这么说?

2 个答案:

答案 0 :(得分:6)

您打印@mtime的内容,但是您将结果放在$mtime中。始终使用use strict; use warnings;。它会找到你的问题。

您的代码应如下所示:

  • 没有File :: stat(stat返回列表):

    use strict;
    use warnings;
    my $file  = "samplefile"; 
    my $mtime = (stat($file))[9];
    die "Can't stat file: $!\n" if !defined($mtime);
    printf("%d\n", $mtime);
    

    (EXPR)[9]返回列表EXPR返回的第10个元素,如果列表不长,则返回undef。这是您分配给$mtime而非@mtime的标量。

  • 使用File :: stat(stat返回一个对象):

    use strict;
    use warnings;
    use File::stat;
    my $file  = "samplefile"; 
    my $stat = stat($file);
    die "Can't stat file: $!\n" if !$stat;
    printf("%d\n", $stat->mtime);
    

答案 1 :(得分:4)

您正在访问数组@mtime,但您为标量$mtime指定了值。它们不是同一个变量。

如果您使用过

use strict;

你会马上意识到这个问题:

Global symbol "@mtime" requires explicit package name at ...

你应该总是使用

use strict;
use warnings;

不这样做会导致许多额外的工作和“神秘”的错误。