Perl “替代方案”;最后一句话;在do循环中

Perl “替代方案”;最后一句话;在do循环中,perl,control-flow,do-loops,Perl,Control Flow,Do Loops,根据forlast()的perl手册,last不能用于中断do{}循环,但它没有提到替代方法。我维护的脚本具有以下结构: do { ... if (...) { ... last; } } while (...); 我很确定他想进入循环的末尾,但实际上它退出了当前的子例程,所以我需要改变最后一个,或者重构整个循环,如果有更好的方法可以推荐的话 @”http://perldoc.perl.org/functions/last.ht

根据for
last
()的perl手册,
last
不能用于中断
do{}
循环,但它没有提到替代方法。我维护的脚本具有以下结构:

do {
    ...
    if (...) 
    {
        ...
        last;
    }
} while (...);
我很确定他想进入循环的末尾,但实际上它退出了当前的子例程,所以我需要改变
最后一个
,或者重构整个循环,如果有更好的方法可以推荐的话

@”http://perldoc.perl.org/functions/last.html“: last不能用于退出返回值(如eval{}、sub{}或do{})的块,也不应用于退出grep()或map()操作

因此,在“while()”中使用一个布尔值,并将其设置为“last”…

do BLOCK while(EXPR)
很有趣,因为do实际上不是一个循环结构。因此,last、next和redo不应该在那里使用。去掉最后一个,并在发现这种情况时调整EXPR以评估false。 此外,启用strict,这至少会在此处给您一个警告。

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

这适用于最后一次重做,但不适用于下一次;为此,将裸块放在do块内:

do {{
    ...
    if (...) 
    {
        ...
        next;
    }
    ...
}} while (...);

从不喜欢Perl中的do/while循环。
do
并不是一个真正的循环,这就是为什么
last
不会突破它的原因。在我们的旧<代码> Pascal <代码>迷宫中,你不能在中间退出一个循环,因为根据圣人Niklaus的“一个入口/一个出口”Wirth,这是错误的。因此,我们必须创建一个退出标志。在Perl中,它看起来像这样:

my $endFlag = 0;
do {
    ...
    if (...) 
    {
        ...
        $endFlag = 1;
    }
} while ((...) and (not $endFlag));

现在,您可以看到,虽然Pascal从未流行起来。

为什么不使用while循环呢

while (...) {
  ...
  if (...) {
    last;
  }
}
您可能需要稍微更改您的逻辑,以适应这样一个事实,即您的测试是在循环的开始而不是结束,但这应该是微不足道的


顺便说一句,如果你使用Delphi,你实际上可以打破Pascal循环,Delphi确实流行了一段时间,直到微软发明了.net语言。

晚会晚了-我最近一直在(;;)
。在我的初步测试中,对于条件表达式
A
B
,您想使用什么:

do {
    last if A;
} while(B);
可通过以下方式实现:

for(;; B || last) {
    last if A;
}
有点难看,但可能不比其他解决方法更难看:)。例如:

my $i=1; 
for(;; $i<=3 || last) { 
    print "$i ";
    ++$i;
}

(使用
|
,因为它的优先级高于

就教学语言而言,帕斯卡并没有那么糟糕:)但我很高兴我再也不用看(或写)了又是一行Pascal代码。如果只有这一行以及其他任何一行代码能够阻止VBscript流行起来的话,那该多好。这一点在中提到过,尽管我认为如果在裸块和上一个
语句中使用标签会更清楚。我一直都知道,Perl是一种病态的语言!do while循环实际上不是循环,但裸块是循环::facepalm::无论如何,我还是喜欢Perl,因为它非常粗糙,可以快速而肮脏地解决复杂问题,“非常肮脏”;-)+1作为您的解决方案。另一种方法是不要使用
do{}
+1作为Delphi的选项:)。我真的很喜欢德尔福。我还使用它的链接器和DOS C编译器来编写Win32 C程序:)。
my $i=1; 
for(;; $i<=3 || last) { 
    print "$i ";
    ++$i;
}
my $i=1;
for(;; ++$i, $i<=3 || last) { 
    print "$i ";
}