2008-11-19 10 views
244

मैं एक for पाश में एक break कथन का उपयोग करने के लिए कोशिश कर रहा हूँ, लेकिन जब से मैं अपने पर्ल कोड में सख्त बाद के चरणों का उपयोग कर रहा हूँ, मैं कह एक त्रुटि हो रही है:मैं पर्ल में लूप से कैसे टूट सकता हूं?

Bareword "तोड़" के लिए अनुमति नहीं जबकि ./final.pl लाइन 154.

पर "सख्त बाद के चरणों" उपयोग में इसके लिए एक समाधान (सख्त बाद के चरणों को निष्क्रिय करने के अलावा) है? इस प्रकार

मेरे कोड स्वरूपित है:

for my $entry (@array){ 
    if ($string eq "text"){ 
     break; 
    } 
} 
+17

और यदि आपके पास "सख्त सबस" नहीं है, तो आपको एक रन-टाइम त्रुटि मिल जाएगी, जब इसे उपनाम "ब्रेक" नहीं मिल सका। –

उत्तर

357

ओह, मुझे मिल गया। एक बड़ी यात्रा मैं बीच में आता है का उपयोग कर पसंद पर

FOO: { 
     for my $i (@listone){ 
      for my $j (@listtwo){ 
       if (cond($i,$j)){ 

        last FOO; # ---> 
            # | 
       }     # | 
      }      # | 
     }       # | 
} # <------------------------------- 
+0

हालांकि यह केवल एक अर्थपूर्ण अंतर है और "अगली" कमांड के साथ पाठ्यचर्या स्थिरता के अलावा अन्य कुछ भी नहीं है। –

+0

उल्लेख नहीं है कि 'ब्रेक'> 5.010 सही में एक प्रयोगात्मक कीवर्ड है? तो आपको दिए गए ब्लॉक त्रुटि के बाहर एक अवैध हो सकता है, न कि आपको इसका उपयोग करना चाहिए। एकमात्र तरीका यह भी काम करेगा कि यदि आप किसी दिए गए ब्लॉक के अंदर थोड़ी देर लूप का इस्तेमाल करते हैं, और फिर तोड़ते हैं, जो सिद्धांत में जिस तरीके से आप चाहते थे, वैसे ही काम करेगा (और केवल अगर) दिए गए ब्लॉक में केवल थोड़ी देर लूप थी, और मान लीजिए कि आप केवल कुछ स्केलर वैरिएबल को खिला रहे थे ... लेकिन यह सब सिर्फ ब्रेक का उपयोग करने के लिए क्यों काम करता है, यह (बहुत) खराब रूप है, उल्लेख नहीं करना (ब्लाह!) बस इतना कह रहा है, इसका "संभव" सिर्फ अच्छा नहीं है विचार और नहीं, आपको लगता है कि यह – osirisgothra

+11

किसी कारण से है, मैं इस कीवर्ड 'अंतिम' को याद रखने में पूरी तरह असमर्थ हूं। हमेशा गुगलिंग 'पर्ल ब्रेक लूप' समाप्त करें :( – Thupten

161

अतिरिक्त डेटा का उपयोग करें। बस छोड़ने की Ctrl +सी प्रेस: ​​

my $exitflag = 0; 
$SIG{INT} = sub { $exitflag=1 }; 

while(!$exitflag) { 
    # Do your stuff 
} 
+2

आपको वास्तव में फूड्स के बाद ब्रेसिज़ की आवश्यकता नहीं है: – cjm

+11

यदि आपके पास मेरे $ i लूप के बाद भी अन्य कोड है तो आप भी छोड़ना चाहते हैं। बाहरी {} एक नंगे ब्लॉक है, जो खुद ही एक मजेदार प्रकार का लूप है जो अंतिम/फिर से/अगली बार हो सकता है। – ysth

3

: आप (यदि आप अधिक प्रश्न हैं) lastbreak के बजाय

for my $entry (@array){ 
    if ($string eq "text"){ 
     last; 
    } 
} 
+0

यह अच्छा है, मेरे पास –

+0

से पहले $ SIG {INT} का प्रमुख नहीं था वास्तव में बहुत उपयोगी सुझाव। +1 – Keve

11

सीधे शब्दों में last यहाँ काम करेगा:

for my $entry (@array){ 
    if ($string eq "text"){ 
     last; 
    } 
} 

आप छोरों नेस्ट है, तो last अंतरतम से बाहर निकल जाएगा। इस मामले में लेबल का उपयोग करें:

LBL_SCORE: { 
     for my $entry1 (@array1){ 
      for my $entry2 (@array2){ 
       if ($entry1 eq $entry2){ # or any condition 
        last LBL_SCORE; 
       } 
      } 
     } 
} 

को देखते हुए last बयान दोनों छोरों से बाहर आने के लिए संकलक कर देगा। किसी भी लूप में भी किया जा सकता है, और लेबल कहीं भी तय किए जा सकते हैं।

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