如何在Perl中打破循环?

如何在Perl中打破循环?,perl,loops,break,strict,Perl,Loops,Break,Strict,我试图在for循环中使用break语句,但由于我在Perl代码中也使用了严格的sub,因此我得到一个错误,即: 不允许在以下情况下使用裸字“break” 在./final.pl使用的“严格subs” 第154行 是否有解决方法(除了禁用严格的SUB) 我的代码格式如下: for my $entry (@array){ if ($string eq "text"){ break; } } 哦,我找到了。您使用而不是 其他数据(如果您有更多问题): FOO:{ 我

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

不允许在以下情况下使用裸字“break” 在./final.pl使用的“严格subs” 第154行

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

我的代码格式如下:

for my $entry (@array){
    if ($string eq "text"){
         break;
    }
}
哦,我找到了。您使用而不是

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

FOO:{
我的$i(@listone){
我的$j(@listwo){
如果(cond($i,$j)){
最后一个FOO;#-->
# |
}                 # |
}                        # |
}                           # |

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


只需
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
语句将使编译器从两个循环中出来。这可以在任意数量的循环中完成,标签可以固定在任何位置。

对于带有隐式循环的Perl单行程序(使用
-n
-p
命令行选项),使用
last
last 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
相同,在输入上的每个循环迭代后也添加
打印

另请参见:




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



如果没有启用“strict subs”,当它找不到名为“break”的sub时,就会出现运行时错误。实际上,FOO后面不需要大括号:如果在for my$i循环后面有其他代码,您也希望跳过,那么您就需要这样做。外部{}是一个裸块,它本身是一种有趣的循环,可以是last/redo/next'd。虽然这只是语义上的区别,除了与“next”命令的文本一致性之外,没有什么其他意义。更不用说,>5.010中的“break”是一个实验性关键字,对吗?因此,您可能会得到一个非法的外部给定块错误,而不是您应该使用它。唯一可行的方法是在给定块内使用while循环,然后中断,理论上,如果(且仅当)给定块中只有while循环,并且假设您只是在输入给定的标量变量,则该方法将按您希望的方式工作。。。但是为什么所有这些工作只是为了休息,这是(非常)糟糕的形式,更不用说(废话!)只是说,这“可能”不是一个好主意&不是你可能认为的那样。出于某种原因,我完全记不住这个关键字“最后”。总是在谷歌上搜索“perl中断循环”:(同样,在
while
()循环中也是如此。
我的@array=(“,”,“苹果”,“橙色”);我的$thing;while($thing=shift@array){last if$thing=~/[A-Za-z]/}打印($thing);#“苹果”
这确实是一个非常有用的建议+1@PeterMortensen-这在windows中运行良好,windows需要记住的唯一一件事可能是在打印到标准输出“$|=1”时启用自动刷新`
LBL_SCORE: {
    for my $entry1 (@array1) {
        for my $entry2 (@array2) {
            if ($entry1 eq $entry2) { # Or any condition
                last LBL_SCORE;
            }
        }
    }
 }
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