我在perl中有一个while循环,如果在中间我需要爆发.我看到最后的标签; 是我如何摆脱循环,但我无法弄清楚在哪里添加标签.这是我的示例代码.
my $count = 5;
do {
print $count;
if ( $count == 2 ) { last TAG; }
$count--;
} while ( $count > 0 );
TAG: print "out";
Run Code Online (Sandbox Code Playgroud)
以上失败,找不到标签.我究竟做错了什么?谢谢你的期待.
doBLOCK并不能算作一个循环,所以循环控制语句next,last或者redo不能用离开或重新启动该块.请参阅perlsyn替代策略.
相反,我建议使用while循环.
my $count = 5;
while ( $count > 0 ) {
print $count;
last if $count == 2;
$count--;
}
print "out";
Run Code Online (Sandbox Code Playgroud)
输出:
5432out
Run Code Online (Sandbox Code Playgroud)
如果你需要一个在测试条件之前总是运行一次的构造,那么使用while这种形式的循环:
while (1) {
...
last if COND;
}
Run Code Online (Sandbox Code Playgroud)
do BLOCK while COND;
Run Code Online (Sandbox Code Playgroud)
只是附加do BLOCK了一个语句修饰符.虽然它特别容易进行底部测试,但它不像流程控制语句那样while (COND) BLOCK.last和朋友只影响流控制语句,而不影响语句修饰符.
$ perl -e'last while 1;'
Can't "last" outside a loop block at -e line 1.
Run Code Online (Sandbox Code Playgroud)
一个技巧是添加一个裸循环.
do {{
...;
next if ...;
...;
}} while COND;
Run Code Online (Sandbox Code Playgroud)
要么
{
do {
...;
last if ...;
...;
} while COND;
}
Run Code Online (Sandbox Code Playgroud)
但这很脆弱,容易出错并且具有误导性.我更喜欢使用无限循环,因为它更安全,更清晰.
while (1) {
...;
next if ...;
last if ...;
...;
last if !COND;
}
Run Code Online (Sandbox Code Playgroud)
如果你真的不喜欢无限循环,你也可以使用以下内容,但我认为它更复杂.(两个额外的陈述.)
for (my $loop=1; $loop; $loop=COND) {
...;
next if ...;
last if ...;
...;
}
Run Code Online (Sandbox Code Playgroud)