我试图在for循环中使用break语句,但由于我也在Perl代码中使用了严格的sub,所以我得到了一个错误提示:

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

有什么解决办法吗(除了禁用严格的sub)?

我的代码格式如下:

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

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

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

其他数据(以防您有更多问题):

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

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

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

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

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

简单的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;
            }
        }
    }
 }

给定最后一个语句将使编译器从两个循环中出来。同样的事情可以在任意数量的循环中完成,标签可以固定在任何地方。

对于带有隐式循环(使用-n或-p命令行选项)的Perl一行程序,使用last或last 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。

参见:

最后一个文档 最后,下一步,重做,继续-一个示例 Perlrun:命令行切换文档


Perl一行程序中last的更多示例:

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