Perlでループから抜け出すにはどうすればよいですか?


295

ループでbreakステートメントを使用しようとしていますforが、Perlコードでstrict subsも使用しているため、次のエラーが表示されます。

./final.pl 154行目で「strict subs」を使用している間は、単語の「ブレーク」は許可されません。

これに対する回避策はありますか(厳密なサブを無効にする以外に)?

私のコードは次のようにフォーマットされています:

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

22
また、「strict subs」をオンにしていない場合は、「break」という名前のサブが見つからないときに、代わりに実行時エラーが発生します。
Paul Tomblin、

回答:


441

ああ、見つけた。あなたは休憩の代わりに最後を使用します

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

ただし、これは単なる意味上の違いであり、「next」コマンドとのテキストの一貫性以外にはほとんど意味がありません。
Razor Storm

1
「break」が5.010以上の実験的なキーワードであることは言うまでもありませんか?だから、あなたはそれを使用するべきではなく、与えられたブロックエラーの外で違法になるかもしれません。動作する唯一の方法は、特定のブロック内でwhileループを使用してから中断する場合です。理論的には、特定のブロックにwhileループしか含まれていない場合に限り、IFが必要な方法で動作します。あなたがスカラー変数を与えられて供給していると仮定して...しかし、なぜ休憩を使用するためだけにすべてのことを行うのか、それは(非常に)悪い形であり、言うまでもありません(まさか!)アイデア&あなたが思うかもしれないものではない
osirisgothra

25
どういうわけか、私はこのキーワード「最後」を完全に思い出せません。常にグーグル 'perl break loop'になってしまう:(
Thupten

また、for while()ループでも同じように機能します。 my @array = ("_", "apple", "orange"); my $thing; while ($thing = shift @array){ last if $thing =~ /[A-Za-z]/; } print($thing); # "apple"
HoldOffHunger

175

追加データ(さらに質問がある場合):

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

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

2
あなたが実際にFOO後にカッコを必要としません:
CJM

14
for $ iループの直後に、スキップしたい他のコードがある場合は、そうします。外側の{}は裸のブロックであり、それ自体が最後の/やり直し/次のループにできる面白い種類のループです。
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
Keve

@PeterMortensen -これはウィンドウで正常に動作します、ウィンドウの心に留めておくべき唯一のことは、あなたがSTDOUT「$に印刷する場合は自動フラッシュをオンにするかもしれ| = 1; `
MortenB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.