在do循环中替代"last"

DAG*_*DAG 8 perl control-flow do-loops

根据perl手册for last(http://perldoc.perl.org/functions/last.html),last不能用于打破do {}循环,但它没有提到替代方案.我正在维护的脚本具有以下结构:

do {
    ...
    if (...) 
    {
        ...
        last;
    }
} while (...);
Run Code Online (Sandbox Code Playgroud)

而且我很确定他想要循环结束,但它实际上退出了当前子程序,所以last如果有更好的方法可以推荐,我需要更改或重构整个循环.

yst*_*sth 16

将do"循环"包装在一个裸块(这一个循环)中:

{
    do {
        ...
        if (...) 
        {
            ...
            last;
        }
    } while (...);
}
Run Code Online (Sandbox Code Playgroud)

这适用于最后和重做,但不适用于下一个; 对于那个地方do块中的裸块:

do {{
    ...
    if (...) 
    {
        ...
        next;
    }
    ...
}} while (...);
Run Code Online (Sandbox Code Playgroud)

  • 我一直都知道,Perl是一种生病的语言!do-while-loops实际上没有循环,但是裸块是循环:: facepalm ::无论如何,我喜欢Perl,因为它非常hacky,你可以快速和肮脏地解决复杂的问题,"非常脏";-) +1为您的解决方案. (4认同)
  • 这在[perlsyn](http://perldoc.perl.org/perlsyn.html#Statement-Modifiers)中提到过,虽然我认为如果你在裸块和`last`语句中使用标签会更清楚. (3认同)

cav*_*man 10

do BLOCK while (EXPR)很有趣,因为这不是一个真正的循环结构.因此,不应该在那里使用last,next和redo.摆脱最后一个并调整EXPR以在找到该情况时评估错误.此外,打开严格,这应该至少给你一个警告.