-1

我正在编写一个脚本,该脚本显示现有文件的年龄,然后在大约 4 小时后自动删除它(假定的维护窗口)。我一直在尝试使用statPerl 中的函数测试我的输出。我们有多个机器,其中一些运行 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()返回 a @_,所以我尝试将我的数据类型更改为此。但它不断回来说mtime尚未初始化。为什么这么说?

4

2 回答 2

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]返回列表的第 10 个元素,EXPR如果列表不是那么长,则返回 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);
    
于 2013-06-14T22:51:14.493 回答
4

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

如果你用过

use strict;

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

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

您应该始终使用

use strict;
use warnings;

不这样做会给你带来很多额外的工作和“神秘”的错误。

于 2013-06-14T22:47:42.987 回答