Perl'deki bir döngüden nasıl çıkabilirim?


295

breakBir fordöngü içinde bir ifade kullanmaya çalışıyorum , ama aynı zamanda benim Perl kodunda katı subs kullanıyorum beri, bir hata mesajı alıyorum:

./Final.pl satır 154'te "katı subs" kullanılırken bareword "break" a izin verilmez.

Bunun için bir çözüm var mı (katı subs'leri devre dışı bırakmanın yanı sıra)?

Kodum aşağıdaki gibi biçimlendirilmiştir:

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

22
Ve "katı subs" olmasaydı, bunun yerine "break" adlı bir alt bulamadığında bir çalışma zamanı hatası alırsınız.
Paul Tomblin

Yanıtlar:


441

Oh, buldum. Sen kullanmak son yerine mola

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

Bu sadece anlamsal bir fark olsa da ve "sonraki" komutuyla metin tutarlılığından başka bir şey değildir.
Razor Storm

1
'break'un> 5.010'da deneysel bir anahtar kelime olduğundan bahsetmiyorum değil mi? bu nedenle, kullanmanız gerekmediği için, dışarıda verilen bir blok hatası alabilirsiniz. İşe yarayacak tek yol, belirli bir blok içinde bir while döngüsü kullandığınızda ve sonra kırılırsa, bu teoride teorik olarak IF'de (ve sadece verilen blokta while döngüsü varsa) istediğiniz şekilde çalışır ve bazı skaler değişken verildiğinde sadece beslediğinizi varsayarsak ... ama neden tüm bunlar sadece bir mola vermek için işe yarıyor, (çok) kötü bir form, bahsetmiyorum (falan!) sadece "olası" iyi değil fikir ve ne düşündüğünüzü değil
osirisgothra

25
nedense, ben tamamen bu anahtar kelime 'son' hatırlayamıyorum. her zaman googling 'perl break loop'
bitirir

Ayrıca, while() döngüler için de aynı şekilde çalışır . my @array = ("_", "apple", "orange"); my $thing; while ($thing = shift @array){ last if $thing =~ /[A-Za-z]/; } print($thing); # "apple"
HoldOffHunger

175

Ek veriler (daha fazla sorunuz varsa):

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

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

2
Aslında FOO sonra parantez gerekmez:
cjm

14
Eğer atlamak istediğiniz benim $ i döngü için hemen sonra başka bir kod varsa yaparsınız. Dış {} çıplak bir bloktur, bu da son / yineleme / sonraki olabilir komik bir döngü türüdür.
08:23

18

Sadece lastburada işe yarar:

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

İç içe döngüleriniz varsa last, en içteki döngüden çıkar. Bu durumda etiketleri kullanın:

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

Verilen bir lastaçıklama derleyicinin her iki döngüden çıkmasını sağlayacaktır. Aynı şey herhangi bir sayıda döngüde yapılabilir ve etiketler herhangi bir yere sabitlenebilir.


6

Büyük bir yinelemede kesintileri kullanmayı seviyorum. Çıkmak için Ctrl+ tuşuna basmanız Cyeterlidir:

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

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

Gerçekten çok yararlı bir öneri. +1
Keve

@PeterMortensen - bu pencerelerde iyi çalışıyor, pencereler için akılda tutulması gereken tek şey STDOUT '$ | = 1; ``
MortenB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.