如何在Perl中打破循环?

时间:2008-11-19 20:21:49

标签: perl loops break strict

我正在尝试在break循环中使用for语句,但由于我在Perl代码中也使用了严格的subs,因此我收到错误消息:

  

Bareword“break”不允许   在./final.pl中使用的“strict subs”   第154行。

是否有针对此的解决方法(除了禁用严格的潜艇)?

我的代码格式如下:

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

5 个答案:

答案 0 :(得分:410)

哦,我找到了。您使用last代替break

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

答案 1 :(得分:171)

其他数据(如果您有更多问题):

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

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

答案 2 :(得分:17)

只需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语句将使编译器从两个循环中出来。可以在任意数量的循环中完成相同的操作,并且可以在任何地方修复标签。

答案 3 :(得分:4)

在大型迭代中,我喜欢使用中断。只需按 Ctrl + C 即可退出:

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

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

答案 4 :(得分:0)

对于具有隐式循环(使用-n-p命令行选项的Perl单行代码),请使用lastlast LINE来中断循环访问输入记录。例如,这些简单的示例都将打印输入的前两行:

echo 1 2 3 4 | xargs -n1 | perl -ne 'last if $. == 3; print;'
echo 1 2 3 4 | xargs -n1 | perl -ne 'last LINE if $. == 3; print;'
echo 1 2 3 4 | xargs -n1 | perl -pe 'last if $. == 3;'
echo 1 2 3 4 | xargs -n1 | perl -pe 'last LINE if $. == 3;'

所有打印:

1
2

perl单行代码使用以下命令行标志:
-e:告诉Perl在代码中而不是在文件中查找代码。
-n:一次遍历输入一行,默认情况下将其分配给$_
-p:与-n相同,在每次循环遍历输入后也添加print

另请参见:

last docs
last, next, redo, continue - an illustrated example
perlrun: command line switches docs


Perl单行代码中last的更多示例:

Break one liner command line script after first match
Print the first N lines of a huge file