मैं पर्ल में एक लूप से कैसे टूट सकता हूं?


295

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

./Final.pl लाइन 154 पर "सख्त उप" का उपयोग करते समय "विराम" की अनुमति नहीं है।

क्या इसके लिए कोई वर्कअराउंड है (इसके अलावा सख्त सब्सक्रिप्शन को अक्षम करना)?

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

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

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

जवाबों:


441

ओह, मैंने पाया। आप ब्रेक के बजाय अंतिम का उपयोग करें

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

हालांकि यह केवल एक अर्थगत अंतर है और "अगले" कमांड के साथ पाठीय संगति के अलावा किसी और राशि के लिए नहीं है।
रेजर स्टॉर्म

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

25
किसी कारण से, मैं इस खोजशब्द को 'अंतिम' याद रखने में पूरी तरह असमर्थ हूँ। हमेशा गोग्लिंग 'पर्ल ब्रेक लूप' को समाप्त करें :(
थूप्टेन

इसके अलावा, while() छोरों के लिए भी यही काम करता है । my @array = ("_", "apple", "orange"); my $thing; while ($thing = shift @array){ last if $thing =~ /[A-Za-z]/; } print($thing); # "apple"
होल्डऑफ हंगल

175

अतिरिक्त डेटा (यदि आपके पास अधिक प्रश्न हैं):

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

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

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

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

18

बस 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बयान देने से कंपाइलर दोनों छोरों से बाहर आ जाएगा। वही किसी भी संख्या में छोरों पर किया जा सकता है, और लेबल कहीं भी तय किए जा सकते हैं।


6

एक बड़े पुनरावृत्ति पर मुझे इंटरप्ट का उपयोग करना पसंद है। बस छोड़ने के लिए Ctrl+ दबाएँ C:

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

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

बहुत उपयोगी सुझाव वास्तव में। +1
केव

`; = 1 | - @PeterMortensen इस विंडो में ठीक काम करता है, विंडो के लिए ध्यान में रखना है केवल एक चीज autoflush चालू करने के लिए $ अगर आप STDOUT पर प्रिंट हो सकता है '
MortenB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.