在perl中的嵌套while循环中中断最内层循环:找不到Label

Håk*_*and 5 perl

我有一个问题是在双嵌套while循环中突破最内层的封闭循环.考虑:

use v5.14;

my $i=0;
while ($i<=1) {
    my $j=0;
    do {
        last if $j==2;
        say $j++;
    } while ($j<4);
    $i++;
}
Run Code Online (Sandbox Code Playgroud)

输出在这里:

0
1
Run Code Online (Sandbox Code Playgroud)

而预期的产出应该是:

0
1
0
1
Run Code Online (Sandbox Code Playgroud)

在最里面的封闭循环中添加标签:

my $i=0;
while ($i<=1) {
    my $j=0;
    LINE: do {
        last LINE if $j==2;
        say $j++;
    } while ($j<4);
    $i++;
}
Run Code Online (Sandbox Code Playgroud)

给出错误:

Label not found for "last LINE" at ./p.pl line 9.
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 8

您只能使用last,next并且redo在使用a的循环中BLOCK.

  • while (EXPR) BLOCK
  • until (EXPR) BLOCK
  • for (LIST) BLOCK
  • for (EXPR; EXPR; EXPR) BLOCK
  • BLOCK

你不能在语句修饰符[1]创建的循环上使用它们.

  • EXPR while EXPR;
  • EXPR until EXPR;

do BLOCK while EXPR;只是一个例子EXPR while EXPR;.循环没有BLOCKfor for lastwork.它只是一个while修改do函数[2]的语句修饰符.do被修改的函数有一个BLOCKdo不是循环.


你可以添加一个循环last,例如一个BLOCK通常只执行一次的裸循环().

my $i=0;
while ($i<=1) {
    LOOP: {
        my $j=0;
        do {
            last if $j==2;
            say $j++;
        } while ($j<4);
    }
    ++$i;
}
Run Code Online (Sandbox Code Playgroud)

但如果我们能确保++$i总是执行,我们可以只是next外循环.

my $i=0;
while ($i<=1) {
    my $j=0;
    do {
        next if $j==2;
        say $j++;
    } while ($j<4);
} continue {
    ++$i;
}
Run Code Online (Sandbox Code Playgroud)

以上简化为

for (my $i=0; $i<=1; ++$i) {
    my $j=0;
    do {
        next if $j==2;
        say $j++;
    } while ($j<4);
}
Run Code Online (Sandbox Code Playgroud)

这简化为

for my $i (0..1) {
    my $j=0;
    do {
        next if $j==2;
        say $j++;
    } while ($j<4);
}
Run Code Online (Sandbox Code Playgroud)

当然,这假设我们需要保留do while.如果没有,我们可以写

for my $i (0..1) {
    for my $j (0..3) {
        last if $j==2;
        say $j;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 或者我想.原来它适用于for!!!!

    >perl -we"print($_), (($_ == 5) && last) for 1..10; print(qq{\ndone\n});"
    12345
    done
    
    Run Code Online (Sandbox Code Playgroud)
  2. 好吧,不是"仅仅".它特别容易进行底部测试,而不是经过顶级测试.


Сух*_*й27 2

你不能使用lastinsidedo{}块,但你可以

my $i=0;
while ($i<=1) {
    my $j=0;
    LINE: { 
      do {
        last LINE if $j==2;
        say $j++;
      } while ($j<4); 
    }
    $i++;
}
Run Code Online (Sandbox Code Playgroud)

或者

my $i=0;
OUTER: while ($i<=1) {
    my $j=0;
    LINE: do {
        next OUTER if $j==2;
        say $j++;
    } while ($j<4);
}
continue {
    $i++;
}
Run Code Online (Sandbox Code Playgroud)