【发布时间】:2012-01-12 03:48:52
【问题描述】:
我不知道这里发生了什么。下面的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 中修复。
【问题讨论】:
标签: arrays perl time-hires