Perl “替代方案”;最后一句话;在do循环中
根据forPerl “替代方案”;最后一句话;在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
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 ";
}