2011-12-03 31 views
7

Tôi không thể tìm ra những gì đang xảy ra ở đây. 8 từ dưới đây đến từ đâu?Tại sao Thời gian :: HiRes :: index break index?

Time::HiRes cung cấp tình trạng quá tải stat giúp mở rộng thời gian có độ phân giải cao (được hỗ trợ trên hệ thống của tôi).

$ 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 

Tệp cụ thể đó không có dấu thời gian độ phân giải cao, nhưng đó không phải là điều bí ẩn: bí ẩn là V2, in 8. Trên thực tế, nó luôn in số trong dấu ngoặc vuông.

Câu trả lời rõ ràng, nó phân tích khác nhau, dường như không đúng:

$ 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 

Họ deparse cùng (trừ các tùy chọn khác nhau để use Time::HiRes).

Nó hoạt động tốt nếu tôi sử dụng chức năng của riêng tôi trong cú pháp tương tự, và tôi không thể có được câu trả lời "sai" ngay cả khi tôi trở lại một cái gì đó ngớ ngẩn từ chức năng của tôi:

$ 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"' 

$ 

Đây là gói perl Debian , phiên bản 5.14.2-5. Tôi nhận được kết quả tương tự với 5.10.1-17squeeze2.

V2, ở trên, sản xuất 8 như thế nào? Tôi có hiểu lầm cú pháp Perl theo một cách nào đó hay tôi chỉ cần gửi báo cáo lỗi?

chỉnh sửa: Như @cjm nói, đây là lỗi. Nó đã được sửa trong Time-HiRes-1.9725 theo báo cáo.

Trả lời

3

Đó chắc chắn là một lỗi, mặc dù tôi không chắc liệu nó nằm trong lõi Perl hay trong Time :: HiRes. Tôi nhận được kết quả tương tự với Perl 5.14.2 trên Gentoo (và cũng với 5.8.9 và 5.10.0). Bạn có nhận thấy rằng nó không quan trọng những gì bạn đưa vào subscript?

$ perl -MTime::HiRes=stat -e 'print +(stat("foo"))[215.4], "\n"' 
215.4 
$ perl -MTime::HiRes=stat -e 'print +(stat("foo"))["bar"], "\n"' 
bar 

Tôi có thể là report it in Time::HiRes trước tiên.

Lưu ý: Trong khi họ deparse giống nhau, họ làm tạo opcodes khác nhau (do sự khác biệt giữa cách gọi một built-in và một người dùng định nghĩa phụ):

$ 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 
+0

Cảm ơn bạn, lỗi được báo cáo https://rt.cpan.org/Public/Bug/Display.html?id=72926 ...bạn có thể muốn thêm '$ Time :: HiRes :: VERSION', tôi không có chúng. – derobert

0

Tôi chưa bao giờ sử dụng dòng lệnh thực hiện vì vậy tôi nói với những điều kỳ quặc trong hoạt động của nó.

Tôi đã thấy kết quả không mong muốn khi sử dụng một chỉ số trên một hàm sẽ trả về một mảng.

$y = localtime()[5]; # failed for me (I forget just how) 

nhưng

$y = (localtime())[5]; # worked fine 

này gợi ý cho tôi một lỗi trong (thực hiện của tôi) Perl. Thử nghiệm tốt hơn có thể là dùng thử trong tập lệnh thực tế:

use Time::HiRes qw(stat); 

my @x = stat("foo"); 

print $x[8],"\n"; 

Tôi đang sử dụng Perl của ActiveState trên WinXP để kết quả của tôi có thể không giống nhau. Tuy nhiên, tôi nghĩ rằng nó có thể hữu ích để thử nó trong mã rất đơn giản để xem những gì nó làm.

+2

Đây không phải là lỗi: cú pháp của [Per indexing] (http://perldoc.perl.org/perldata.html#List-value-constructors) của Perl là '(LIST) [INDEX]'. Các dấu ngoặc đơn là bắt buộc. (Hành vi được quan sát bởi derobert và cjm, tuy nhiên, _is_ một lỗi.) –