我无法弄清楚这里发生了什么。下面的8个来自哪里?
Time::HiRes
提供了一个重载,stat
它扩展了获得高分辨率的时间(我的系统支持)。
$ perl -MTime::HiRes -e 'print +(stat("foo"))[8], "\n"' # V1
1322915623
$ perl -MTime::HiRes=stat -e 'print +(stat("foo"))[8], "\n"' # V2
8
$ perl -MTime::HiRes=stat -e '@a = stat("foo"); print $a[8], "\n"' # V3
1322915623
该特定文件没有高分辨率时间戳,但这不是谜:谜是 V2,它打印 8。事实上,它总是在方括号中打印数字。
显而易见的答案,它的解析方式不同,似乎并不正确:
$ perl -MO=Deparse -MTime::HiRes -e 'print +(stat("foo"))[8], "\n"' # V1
use Time::HiRes;
print((stat 'foo')[8], "\n");
-e syntax OK
$ perl -MO=Deparse -MTime::HiRes=stat -e 'print +(stat("foo"))[8], "\n"' # V2
use Time::HiRes (split(/,/, 'stat', 0));
print((stat 'foo')[8], "\n");
-e syntax OK
他们解析相同(除了不同的选项use Time::HiRes
)。
如果我以类似的语法使用我自己的函数,它工作得很好,即使我从我的函数中返回一些愚蠢的东西,我也无法得到“错误”的答案:
$ perl -e 'sub bar() { return qw(a b c d e f g h i j) }; print +(bar)[8], "\n"'
i
$ perl -e 'sub bar() { return undef }; print +(bar)[8], "\n"'
$
这是 Debian 的 perl 包,版本 5.14.2-5。我用 5.10.1-17squeeze2 得到了相同的结果。
上面的 V2 是如何产生 8 的?我是否以某种方式误解了 Perl 语法,或者我只需要提交错误报告?
编辑:正如@cjm 所说,这是一个错误。根据报告,它已在 Time-HiRes-1.9725 中修复。