在perl中打破do while循环

时间:2014-09-11 19:34:53

标签: perl

我在perl中有一个while循环,如果在中间我需要爆发。我看到最后的标签;是我如何摆脱循环,但我无法弄清楚在哪里添加标签。这是我的示例代码。

my $count = 5;

do {
    print $count;

    if ( $count == 2 ) { last TAG; }

    $count--;

} while ( $count > 0 );

TAG: print "out";

以上失败,找不到标签。我究竟做错了什么?谢谢你的期待。

4 个答案:

答案 0 :(得分:7)

请勿使用statement modifierdo形式:

  

do BLOCK 计为循环,因此循环控制语句nextlastredo不能用于离开或重启块。有关替代策略,请参阅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 ) }