2008-11-19 215 views
244

我想在for循环使用break声明,但因为我也在我的Perl代码使用严格的潜艇,我得到一个错误说:如何摆脱Perl中的循环?

裸词“破发”不准而 “严格潜艇”在使用中./final.pl 线154

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

我的代码的格式如下:

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

如果你没有“严格的潜艇”,你会得到一个运行时错误,而不是找到一个名为“break”的子。 – 2008-11-19 20:43:16

回答

357

哦,我发现它。您使用的last代替break

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

虽然这仅仅是一种语义上的差异,除了与“下一个”命令的文本一致性之外,它并不等于其他很多。 – 2010-07-08 20:14:58

+0

更不用说,'break'是一个实验性的关键词,在> 5.010的权利?所以你可能会得到一个非法的外部给定的块错误,而不是你应该使用它。唯一可行的方法是,如果你在给定块内使用了一个while循环,然后中断,这在理论上会按照你想要的方式工作(并且只有)给定的块只有while循环,并且假设你只是给了一些标量变量......但为什么所有这些工作只是为了休息一下,它是(非常)糟糕的形式,更不用说了(blah!)只是说,它的“可能”不是一个好东西想法并不是你可能认为这是 – osirisgothra 2014-09-01 15:50:29

+11

由于某种原因,我完全无法记住这个关键字'最后'。总是以Google搜索'perl break loop'结尾:( – Thupten 2015-09-08 04:50:02

161

附加数据(如果您有更多的问题):

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

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

在我喜欢使用中断大迭代。只需按下Ctrl键+Ç退出:

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

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

只需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声明将使编译器从两个环路出来。在任何数量的循环中都可以做到这一点,并且标签可以在任何地方固定。