der*_*ert 7 arrays perl time-hires
我无法弄清楚这里发生了什么.下面的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
Run Code Online (Sandbox Code Playgroud)
那个特定的文件没有高分辨率的时间戳,但这不是神秘的:神秘的是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
Run Code Online (Sandbox Code Playgroud)
它们相同(除了不同的选项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"'
$
Run Code Online (Sandbox Code Playgroud)
这是Debian的perl包,版本5.14.2-5.我用5.10.1-17squeeze2得到了相同的结果.
上面的V2如何产生8?我是否以某种方式误解了Perl语法,或者我只是需要提交错误报告?
编辑:正如@cjm所说,这是一个错误.根据报告,它已在Time-HiRes-1.9725中修复.
这绝对是一个错误,尽管我不确定它是在 Perl 核心中还是在 Time::HiRes 中。我在 Gentoo 上使用 Perl 5.14.2(以及 5.8.9 和 5.10.0)得到了相同的结果。您是否注意到下标中输入的内容并不重要?
$ perl -MTime::HiRes=stat -e 'print +(stat("foo"))[215.4], "\n"'
215.4
$ perl -MTime::HiRes=stat -e 'print +(stat("foo"))["bar"], "\n"'
bar
Run Code Online (Sandbox Code Playgroud)
我可能会首先在 Time::HiRes 中报告它。
注意:虽然它们解析相同,但它们确实生成不同的操作码(由于调用内置子程序和用户定义子程序之间的差异):
$ perl -MO=Concise -MTime::HiRes -e 'print +(stat("foo"))[8], "\n"'
c <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 271 -e:1) v:{ ->3
b <@> print vK ->c
3 <0> pushmark s ->4
9 <2> lslice lK/2 ->a
- <1> ex-list lK ->6
4 <0> pushmark s ->5
5 <$> const(IV 8) s ->6
- <1> ex-list lK ->9
6 <0> pushmark s ->7
8 <1> stat lK/1 ->9
7 <$> const(PV "foo") s ->8
a <$> const(PV "\n") s ->b
-e syntax OK
$ perl -MO=Concise -MTime::HiRes=stat -e 'print +(stat("foo"))[8], "\n"'
e <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 271 -e:1) v:{ ->3
d <@> print vK ->e
3 <0> pushmark s ->4
b <2> lslice lK/2 ->c
- <1> ex-list lK ->6
4 <0> pushmark s ->5
5 <$> const(IV 8) s ->6
- <1> ex-list lK ->b
6 <0> pushmark s ->7
a <1> entersub[t1] lKS/TARG,1 ->b
- <1> ex-list lK ->a
7 <0> pushmark s ->8
8 <$> const(PV "foo") sM ->9
- <1> ex-rv2cv sK ->-
9 <$> gv(*stat) s ->a
c <$> const(PV "\n") s ->d
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |