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

Posted

技术标签:

【中文标题】使用 stat 在 Perl 中获取未初始化的变量【英文标题】:Getting variable uninitialized in Perl using stat 【发布时间】:2013-06-11 16:22:18 【问题描述】:

我正在编写一个脚本,该脚本显示现有文件的年龄,然后在大约 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 尚未初始化。为什么会这样说?

【问题讨论】:

始终使用use strict; use warnings;! stat 返回一个列表,不可能返回一个数组(例如@_)。 【参考方案1】:

您打印了@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);

【讨论】:

天啊!有效。所以声明它并引用 mtime 就成功了!非常感谢。这真的很有帮助。 没问题。如果这回答了您的问题,请检查它旁边的标记。欢迎使用 Stack Overflow!【参考方案2】:

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

如果你用过

use strict;

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

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

你应该总是使用

use strict;
use warnings;

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

【讨论】:

以上是关于使用 stat 在 Perl 中获取未初始化的变量的主要内容,如果未能解决你的问题,请参考以下文章

日志组件优化报告

Perl - 使用未初始化的值?

perl中stat函数怎么计算文件的大小

在 Perl 中可以未初始化但仍定义值吗?

如何获取给定磁盘 ID 的磁盘名称?

如何检查 Perl 标量变量是不是已初始化?