在perl中打破do while循环

use*_*175 4 perl

我在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)

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

Mil*_*ler 7

不要使用以下语句修饰符形式do:

do BLOCK不能算作一个循环,所以循环控制语句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)

  • `{ ... ; 如果 COND }` 也有效,则重做。从好的方面来说,它看起来不像一个无限循环。不利的一面是,它看起来根本不像一个循环:) (2认同)

ike*_*ami 6

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)