পার্লের লুপটি কীভাবে ভাঙবো?


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> এর একটি পরীক্ষামূলক কীওয়ার্ডের উল্লেখ নেই? যাতে আপনি বাইরের অবৈধ ব্লক ত্রুটি পেতে পারেন, এটি আপনার ব্যবহার করা উচিত নয়। এমনকি যদি আপনি কোনও প্রদত্ত ব্লকের ভিতরে কিছুক্ষণ লুপ ব্যবহার করেন এবং তারপরে বিরতি ঘটে তবে কেবলমাত্র সেই উপায়টিই কাজ করবে যা প্রদত্ত ব্লকের কেবলমাত্র সেখানে লুপ থাকলে এবং ধরে নিচ্ছি যে আপনি কেবল কিছু স্কেলার ভেরিয়েবলকে খাওয়াচ্ছেন ... তবে কেন এই সমস্ত কাজ কেবল একটি বিরতি ব্যবহারের জন্য করা হয়, এটি (খুব) খারাপ রূপ, কেবল (বেলা!) উল্লেখ না করা, এর "সম্ভাব্য" কেবল একটি ভাল নয় ধারণা এবং আপনি এটি কী ভাবতে পারেন তা নয়
ওসিরিসগোথর

25
কোনও কারণে, আমি এই শব্দটি 'শেষ' মনে রাখতে সম্পূর্ণ অক্ষম। সর্বদা গুগলিং 'পার্ল ব্রেক ব্রেক লুপ' শেষ করুন :(
8:15

এছাড়াও, 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;  # --->
                                   # |
                 }                 # |
          }                        # |
       }                           # |
 } # <-------------------------------


14
আমার my i লুপের জন্য অন্য কোডটি রয়েছে যা আপনিও এড়িয়ে যেতে চান আপনি তা করেন। বাহ্যিক {a একটি খালি ব্লক, এটি নিজেই একটি মজাদার ধরণের লুপ যা সর্বশেষ / পুনরায় / পরবর্তী হতে পারে।
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
কেভ

এটি কি উইন্ডোজে কাজ করে? দেখতে ইউনিক্সি লাগছে।
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন - এটি উইন্ডোতে সূক্ষ্মভাবে কাজ করে, উইন্ডোজের মনে রাখার একমাত্র বিষয় হ'ল অটোফ্ল্যাশ চালু করা যদি আপনি STDOUT '`| = 1;
to
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.