2011-12-03 9 views
7

Nie mogę rozgryźć, co tu się dzieje. Skąd pochodzą poniższe 8?Dlaczego indeksacja listy przerwań Time :: HiRes :: stat?

Time::HiRes zapewnia przeciążenie stat, które rozszerza czasy, aby uzyskać wysoką rozdzielczość (co jest obsługiwane w moim systemie).

$ 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 

że dany plik nie posiada wysokiej rozdzielczości znacznik czasu, ale to nie jest tajemnica: tajemnica jest V2, która drukuje 8. W rzeczywistości, to zawsze drukuje liczby w nawiasach kwadratowych.

Oczywista odpowiedź, że analizuje się inaczej, nie wydaje się poprawne:

$ 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 

one deparse takie same (inna niż inną opcję do use Time::HiRes).

To działa dobrze, jeśli mogę użyć własnej funkcji w podobnej składni, a ja nie mogę dostać „złego” odpowiedź nawet jeśli wrócę coś głupie z mojej funkcji:

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

$ 

Jest to pakiet perl Debiana , wersja 5.14.2-5. Otrzymuję takie same wyniki z 5.10.1-17squeeze2.

W jaki sposób V2, powyżej, produkuje 8? Czy nie rozumiem składni Perla w jakiś sposób, czy po prostu muszę złożyć raport o błędzie?

edytuj: Jak mówi @cjm, jest to błąd. Zostało to naprawione w Time-HiRes-1.9725 zgodnie z raportem.

Odpowiedz

3

Z pewnością jest to błąd, chociaż nie jestem pewien, czy jest on w rdzeniu Perla, czy w Time :: HiRes. Te same wyniki uzyskuję z Perl 5.14.2 na Gentoo (a także z 5.8.9 i 5.10.0). Czy zauważyłeś, że nie ma znaczenia, co umieściłeś w indeksie?

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

Najpierw będę prawdopodobnie report it in Time::HiRes.

Uwaga: Podczas gdy deparse samo, robią generować różne opcodes (ze względu na różnicę między wywołaniem wbudowane i sub zdefiniowany przez użytkownika):

$ 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

Dziękuję, zgłoszenie błędu https://rt.cpan.org/Public/Bug/Display.html?id=72926 ...możesz dodać swoje '$ Time :: HiRes :: VERSION's, nie mam ich. – derobert

0

nigdy nie używany z wiersza poleceń wykonanie, więc mówię do dziwactw w jego działaniu.

Podczas korzystania z indeksu dolnego dla funkcji zwracającej tablicę wystąpiły nieoczekiwane wyniki.

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

ale

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

Sugeruje mi błąd w (moim realizacji) Perl. Lepszym testu może być, aby spróbować go w rzeczywistej skryptu:

use Time::HiRes qw(stat); 

my @x = stat("foo"); 

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

używam ActiveState za Perl na WinXP więc moje wyniki mogą nie być takie same. Mimo to, myślę, że może być użyteczne wypróbowanie go w bardzo prostym kodzie, aby zobaczyć, co robi.

+2

To nie jest błąd: składnia w indeksie [indeksowanie list] (http://perldoc.perl.org/perldata.html#List-value-constructors) to '(LISTA) [INDEX]'. Nawiasy są wymagane. (Zachowanie obserwowane przez derobert i cjm jest jednak błędem.) –