此循环永不停止:
while (1)
{
while (1)
{
last;
}
}
此循环停止
while (1)
{
do
{
last;
}
while (1);
}
没有last
,它们的无限性相似。第二个循环结构似乎没有将内循环视为循环。我假设第二个结构last
实际上在内循环开始之前退出外循环。但为什么?在do{}
完成第一次执行后,内循环实际上是“稍后”开始的吗?
答案 0 :(得分:4)
last不能用于退出返回eval等值的块 {},sub {}或do {},不应该用于退出grep()或 map()操作。
do {
# ...
} while (1);
实际上并不是Perl中的循环,因此last
,next
,redo
在其内部无法正常运行。
单个块实际上是循环,因此您可以将do表达式包装在一个块中,以使last
能够按预期运行:
{
do {
last;
} while (1);
}
更直观的解决方案是拥有一个控制exectution的标记值:
my $should_stop = 0;
do {
if ( <some-condition> ) { $should_stop = 1; }
} while ( !$should_stop )