我在perl中有一个while循环,如果在中间我需要爆发。我看到最后的标签;是我如何摆脱循环,但我无法弄清楚在哪里添加标签。这是我的示例代码。
my $count = 5;
do {
print $count;
if ( $count == 2 ) { last TAG; }
$count--;
} while ( $count > 0 );
TAG: print "out";
以上失败,找不到标签。我究竟做错了什么?谢谢你的期待。
答案 0 :(得分:7)
请勿使用statement modifier的do
形式:
do
BLOCK
不计为循环,因此循环控制语句next
,last
或redo
不能用于离开或重启块。有关替代策略,请参阅perlsyn
。
相反,我建议使用while
循环。
my $count = 5;
while ( $count > 0 ) {
print $count;
last if $count == 2;
$count--;
}
print "out";
输出:
5432out
如果你需要一个在测试条件之前总是运行一次的构造,那么使用这种形式的while
循环:
while (1) {
...
last if COND;
}
答案 1 :(得分:6)
do BLOCK while COND;
只是do BLOCK
附加了statement modifier。虽然它是特殊的底部测试,但它不是像while (COND) BLOCK
那样的流控制语句。 last
和朋友只影响流控制语句,而不影响语句修饰符。
$ perl -e'last while 1;'
Can't "last" outside a loop block at -e line 1.
一个技巧是添加一个裸循环。
do {{
...;
next if ...;
...;
}} while COND;
或
{
do {
...;
last if ...;
...;
} while COND;
}
但这很脆弱,容易出错并且具有误导性。我更喜欢使用无限循环,因为它更安全,更清晰。
while (1) {
...;
next if ...;
last if ...;
...;
last if !COND;
}
如果你真的不喜欢无限循环,你也可以使用以下内容,但我认为它更复杂。 (两个额外的陈述。)
for (my $loop=1; $loop; $loop=COND) {
...;
next if ...;
last if ...;
...;
}
答案 2 :(得分:2)
您可以使用goto而不是last。
my $count = 5;
do {
print $count;
if ( $count == 2 ) { goto TAG; }
$count--;
} while ( $count > 0 );
TAG: print "out";
答案 3 :(得分:1)
您的代码被错误放置。你还没有为这个循环命名,你只需在goto LABEL
可以看到的地方放置一个标签。如果你想摆脱循环,你必须标记循环。
此外,do { ... } while
并不算作循环。要创建一个可以标记的循环,请将其放在自己的大括号中:
TAG: { do {
body of the loop goes here.
last TAG if $condition;
} while( COND ) }