web-dev-qa-db-ja.com

どうやってPerlのループから抜け出すことができますか?

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

./final.plの154行目で "strict subs"が使用されている間は、ベアワード "break"は使用できません。

(厳密な潜水艦を無効にする以外に)これのための対応策がありますか?

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

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

ああ、私はそれを見つけました。 break の代わりに last を使用します。

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

追加データ(もっと質問がある場合):

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

                    last FOO;  # --->
                                   # |
                 }                 # |
          }                        # |
       }                           # |
 } # <-------------------------------
171
Kent Fredric

単に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ステートメントがあれば、コンパイラは両方のループから出てきます。ループの数に関係なく同じことができ、ラベルはどこにでも固定できます。

17
Kamal Nayan

大規模な繰り返しでは、割り込みを使うのが好きです。ただ押す Ctrl + C やめるために:

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

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