313

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

在 ./final.pl 第 154 行使用“strict subs”时不允许使用裸词“break”。

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

我的代码格式如下:

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

5 回答 5

462

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

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}
于 2008-11-19T20:23:48.570 回答
177

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

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

                    last FOO;  # --->
                                   # |
                 }                 # |
          }                        # |
       }                           # |
 } # <-------------------------------
于 2008-11-19T20:33:48.723 回答
22

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

于 2017-05-09T14:32:50.227 回答
5

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

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

while(!$exitflag) {
    # Do your stuff
}
于 2015-09-14T23:45:21.637 回答
2

对于带有隐式循环(使用-n-p命令行选项)的 Perl 单行代码,使用lastorlast LINE来跳出遍历输入记录的循环。例如,这些简单的示例都打印输入的前 2 行:

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

也可以看看:

lastdocs
last, next, redo, continue- perlrun示例
:命令行切换 docs


lastPerl 单行代码的更多示例:

在第一次匹配后中断一个线性命令行脚本
打印一个大文件的前 N ​​行

于 2020-08-25T14:02:17.977 回答