在这些示例中,为什么“最后”在Perl中表现不同?

时间:2016-05-18 14:34:55

标签: perl

此循环永不停止:

while (1)
{
    while (1)
    {
        last;
    }
}  

此循环停止

while (1)
{
    do
    {
        last;
    }
    while (1);
}

没有last,它们的无限性相似。第二个循环结构似乎没有将内循环视为循环。我假设第二个结构last实际上在内循环开始之前退出外循环。但为什么?在do{}完成第一次执行后,内循环实际上是“稍后”开始的吗?

1 个答案:

答案 0 :(得分:4)

来自perldoc -f last

  

last不能用于退出返回eval等值的块   {},sub {}或do {},不应该用于退出grep()或   map()操作。

do {
   # ... 
} while (1); 

实际上并不是Perl中的循环,因此lastnextredo在其内部无法正常运行。

单个块实际上是循环,因此您可以将do表达式包装在一个块中,以使last能够按预期运行:

{
   do {
      last; 
   } while (1); 
}

更直观的解决方案是拥有一个控制exectution的标记值:

my $should_stop = 0;
do {  
   if ( <some-condition> ) { $should_stop = 1; }
} while ( !$should_stop )