2011-12-03 5 views
7

मैं यह नहीं समझ सकता कि यहां क्या हो रहा है। नीचे से 8 कहां से आता है?समय :: HiRes :: स्टेट ब्रेक सूची सबस्क्रिप्टिंग क्यों करता है?

Time::HiResstat का अधिभार प्रदान करता है जो उच्च-रिज़ॉल्यूशन (जो मेरे सिस्टम पर समर्थित है) के समय को बढ़ाता है।

$ 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 करने के लिए विभिन्न विकल्प के अलावा अन्य) deparse।

यह ठीक है अगर मैं इसी तरह के वाक्य रचना में अपने कार्य का उपयोग काम करता है, और यहां तक ​​कि अगर मैं अपने समारोह से कुछ मूर्खतापूर्ण लौट रहा "गलत" इस सवाल का जवाब नहीं मिल सकता है:

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

$ 

यह डेबियन के पर्ल पैकेज है , संस्करण 5.14.2-5। मुझे 5.10.1-17 स्क्वीज़ 2 के साथ एक ही परिणाम मिलते हैं।

वी 2, ऊपर, 8 का उत्पादन कैसे करता है? क्या मैं किसी तरह से पर्ल सिंटैक्स को गलत समझ रहा हूं, या क्या मुझे बस एक बग रिपोर्ट दर्ज करने की आवश्यकता है?

संपादित करें: जैसा कि @cjm कहते हैं, यह एक बग है। यह रिपोर्ट के अनुसार टाइम-हायआरस-1.9725 में तय किया गया है।

उत्तर

3

यह निश्चित रूप से एक बग है, हालांकि मुझे यकीन नहीं है कि यह मूल पर्ल या समय :: HiRes में है या नहीं। मुझे Gentoo पर पर्ल 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 

मैं शायद report it in 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 
+0

धन्यवाद, बग की रिपोर्ट https://rt.cpan.org/Public/Bug/Display.html?id=72926 ...आप अपना '$ टाइम :: HiRes :: संस्करण' जोड़ना चाहते हैं, मेरे पास नहीं है। – derobert

0

: एक ओर जहां वे एक ही deparse, वे अलग opcodes (बिल्ट-इन और उपयोगकर्ता-निर्धारित उप बुला के बीच अंतर की वजह से) पैदा करते हैं निष्पादन इसलिए मैं अपने कार्यकलापों में विषमताओं से बात करता हूं।

मैंने किसी फ़ंक्शन पर एक सबस्क्रिप्ट का उपयोग करते समय अप्रत्याशित परिणाम देखे हैं जो किसी सरणी को वापस करना चाहिए।

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

लेकिन

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

यह मैं करने के लिए पर्ल (की मेरी कार्यान्वयन) में एक बग पता चलता है। एक बेहतर परीक्षण एक वास्तविक लिपि में यह प्रयास करने के लिए हो सकता है:

use Time::HiRes qw(stat); 

my @x = stat("foo"); 

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

मैं WinXP पर ActiveState के पर्ल का उपयोग कर रहा हूँ ताकि मेरे परिणाम एक ही नहीं हो सकता। फिर भी, मुझे लगता है कि यह देखने के लिए बहुत आसान कोड में कोशिश करना उपयोगी हो सकता है कि यह क्या करता है।

+2

यह एक बग नहीं है: पर्ल की [सूची अनुक्रमण] (http://perldoc.perl.org/perldata.html#List-value-constructors) वाक्यविन्यास '(LIST) [INDEX]' है। कोष्ठक की आवश्यकता है। (डरोबर्ट और सीजेएम द्वारा देखा गया व्यवहार, हालांकि, _is_ एक बग है।) –

संबंधित मुद्दे