如何在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