2012-04-26 15 views
42

doc के अनुसार के साथ, while बयान के रूप में लंबे समय के रूप अभिव्यक्ति true है ब्लॉक निष्पादित करता है। मुझे आश्चर्य है कि क्यों यह एक खाली अभिव्यक्ति के साथ अनंत लूप हो जाता है:पर्ल: जबकि कोई सशर्त

while() { # infinite loop 
... 
} 

यह सिर्फ दस्तावेज़ में अशुद्धि है?

+5

मैं इरादे पर जोर देने के लिए '1 (1)' पसंद करता हूं। – JRFerguson

उत्तर

34
$ perl -MO=Deparse -e 'while() { }' 
while (1) { 
    (); 
} 
-e syntax OK 

ऐसा लगता है कि while() {} और while (1) {} समकक्ष हैं। यह भी ध्यान रखें कि रिक्त स्थान * खाली ब्लॉक में डाले गए हैं।

पूर्व निर्धारित संकलक व्यवहार का एक और उदाहरण:

$ perl -MO=Deparse -e 'while (<>) { }' 
while (defined($_ = <ARGV>)) { 
    (); 
} 
-e syntax OK 

मैं कहूँगा कि यह एक विशेष मामला रिपोर्टिंग न सिर्फ डॉक्स है।

* — सटीक होने के लिए, stub ऑपोड डाला गया है। यह कुछ भी नहीं करता है, लेकिन enterloop ऑपोड के लिए गेटो लक्ष्य प्रदान करता है। इसे ध्यान में रखने का कोई वास्तविक कारण नहीं है। डिप्रिस खाली stub ओप खाली माता-पिता का उपयोग करके इंगित करता है, क्योंकि माता-पिता कोड उत्पन्न नहीं करते हैं।

+12

उत्सुकता से, 'के लिए (;;) '' (1) 'के रूप में भी हटा दिया गया है। –

+3

@briandfoy हाँ, मैंने देखा कि इसे पोस्ट करने के बाद .. एक और विशेष मामला।यहां तक ​​कि अधिक उत्सुकता से '() 'के लिए एक वाक्यविन्यास त्रुटि है, लेकिन' (()) के लिए 'संकलित करता है, लेकिन' (1) 'मामले में संकलित नहीं होता है, लेकिन' $ _ (()) का अनुमान लगाता है। – TLP

+0

@TLP नहीं, वह अंतिम व्यक्ति समझ में आता है। '() के लिए दो वाक्यविन्यास हैं जिनके बारे में मुझे पता है: सी-शैली और सूची में foreach। तो यह नहीं जानता कि आप कौन सा चाहते हैं। 'के लिए (())' खाली सरणी पर एक foreach है: (perl -e '(()) {print "foo";}' ' – Izkata

11

यह एक विशेष मामला है। बस true को एक खाली हालत अभिव्यक्ति चूक है, जो "पाश हमेशा के लिए इसका मतलब है, या एक break जब तक। सी (और पर्ल) मुहावरा

for(;;) { 
    // Neverending fun 
} 

इसी कारण ही होता है में।

वहाँ नहीं करता है 'टी आधिकारिक पर्ल डॉक्स में इस का कोई उल्लेख दिखाई देते हैं, और अभी तक इसके लिए पार्सर में एक विशेष नियम नहीं है। शायद यह :)

for(;;) मुहावरा हालांकि कम असामान्य है क्योंकि कोई भी इसे इस्तेमाल करता है।

+4

यदि यह है, तो निश्चित रूप से यह दस्तावेज़ में उल्लेख की आवश्यकता है। – codaddict

+0

क्या यह कहीं दस्तावेज है? –

+1

निश्चित रूप से। झूठी (0, "", undef) के रूप में परिभाषित कुछ विशिष्ट चीजें हैं। बाकी सब कुछ डिफ़ॉल्ट रूप से सच है। – delicateLatticeworkFever

14

यह Vacuous Truth की अवधारणा का एक विशेष मामला है। यदि कोई शर्त नहीं है, तो स्थिति है जबकि स्थिति सत्य है स्वयं ही सचमुच सच है।

5853  if (expr) { 
5854   scalar(listop); 
5855   o = new_logop(OP_AND, 0, &expr, &listop); 
5856   if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) { 
5857    op_free(expr);    /* oops, it's a while (0) */ 
5858    op_free((OP*)loop); 
5859    return NULL;    /* listop already freed by new_logop */ 
5860   } 
5861   if (listop) 
5862    ((LISTOP*)listop)->op_last->op_next = 
5863     (o == listop ? redo : LINKLIST(o)); 
5864  } 
5865  else 
5866   o = listop; 

मैं हालत में कोई expr साथ यह सोचते हैं रहा हूँ, हम o = listop तक पहुँचने:

यदि मैं यह सही ढंग से पढ़ रहा हूँ, कोड के प्रासंगिक टुकड़ा होने के लिए around line 5853 of op.c 5.14.1 में लगता है। listop को पहले listop = op_append_list(OP_LINESEQ, block, cont); के रूप में परिभाषित किया गया था।

+1

मुझे नहीं लगता कि यह है; कि o = listop गैर-लूपिंग 'जबकि (())' मामला हो सकता है। 'जबकि()' वास्तव में पार्सर (perly.y) में लागू किया गया है; texpr नियम देखें, जो या तो कुछ भी नहीं है (जिस स्थिति में यह सचमुच दिखाता है कि यह '1') या एक expr देखा। – ysth

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