如何打破Perl的循环?


295

我试图breakfor循环中使用一条语句,但是由于我也在Perl代码中使用了严格的subs,因此出现了一条错误消息:

在./final.pl第154行中使用“严格限制”时,不允许使用标头“ break”。

有没有解决的办法(除了禁用严格的潜艇)?

我的代码格式如下:

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

22
而且,如果您没有打开“ strict subs”,那么当它找不到名为“ break”的子项时,就会出现运行时错误。
Paul Tomblin,

Answers:


441

哦,我找到了。您使用last而不是break

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

尽管这只是语义上的差异,除了与“ next”命令的文本一致性外,没有其他任何意义。
剃刀风暴

1
更不用说'break'是> 5.010中的实验关键字,对吗?因此您可能会在给定的块错误之外收到非法的错误,而不是应该使用它。唯一可行的方法是,如果在给定的块中使用了while循环,然后中断了,那么从理论上讲,这将以您希望的方式(如果给定的块中仅包含while循环)工作,并且假设您只是给定了一些标量变量而已...但是为什么所有这些工作都只是为了使用中断,这是(非常)糟糕的形式,更不用说(等等!)只是说,它的“可能”只是一个不好的选择想法,而不是您可能会想的是
osirisgothra 2014年

25
由于某种原因,我完全无法记住此关键字“ last”。总是以谷歌搜索“ perl break loop”结尾:(
Thupten

同样,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
如果在$ i循环之后还有其他代码也要跳过,则可以这样做。外部{}是一个裸露的块,它本身是一种有趣的循环,可以最后/重做/下一个循环。
2008年

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-在Windows中工作正常,对于Windows唯一要记住的是,如果您打印到STDOUT'$ | = 1;`
打开自动刷新功能
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.