题
根据Perl手册 last
(http://perldoc.perl.org/functions/last.html), last
不能用来脱离 do {}
循环,但没有提到替代方案。我维护的脚本具有这种结构:
do {
...
if (...)
{
...
last;
}
} while (...);
而且我很确定他想进入循环的尽头,但是它实际上是退出了当前子例程,所以我需要更改 last
或重新分配整个循环,如果有更好的方法可以推荐。
解决方案
do BLOCK while (EXPR)
很有趣,因为Do并不是真正的循环结构。因此,最后,下一个和重做不应该在那里使用。摆脱最后一个并调整Expr以评估这种情况时的错误。另外,打开严格,这应该在这里至少给您警告。
其他提示
将“循环”包裹在裸露的块中(其中 是 一个循环):
{
do {
...
if (...)
{
...
last;
}
} while (...);
}
这适用于最后一个重做,但不下一个。对于那个将裸块内部放置在do块内:
do {{
...
if (...)
{
...
next;
}
...
}} while (...);
从不喜欢perl中的循环。这 do
不是真的循环,这就是为什么 last
不会突破它。在我们的旧 Pascal
发呆,你不能在中间退出循环,因为 那是错误的 根据圣人Niklaus的“一个入口/一个出口” Wirth。因此,我们必须创建一个出口标志。在perl中看起来像这样:
my $endFlag = 0;
do {
...
if (...)
{
...
$endFlag = 1;
}
} while ((...) and (not $endFlag));
现在,您可以看到帕斯卡(Pascal)从未抓住。
为什么不只是使用一个时循环呢?
while (...) {
...
if (...) {
last;
}
}
您可能必须稍微更改逻辑,以适应您的测试是在开始而不是循环末端的事实,但这应该是微不足道的。
顺便说一句,如果您使用的是Delphi,您实际上可以脱离Pascal循环,而Delphi确实抓住了一会儿,直到Microsoft Wine with uped并使用.NET语言出来为止。
@“ http://perldoc.perl.org/functions/last.html”:最后不能用来退出返回一个值的块,例如eval {},sub {}或do {},并且不应用于退出grep()或map()操作。
因此,在“ while()”中使用布尔值,然后将其设置为“ last” ...
聚会迟到 - 我一直在搞砸 for(;;)
最近。在我的基本测试中,有条件表达 A
和 B
, ,您想做什么:
do {
last if A;
} while(B);
可以作为:
for(;; B || last) {
last if A;
}
有点丑陋,但也许比其他解决方法还多:)。一个例子:
my $i=1;
for(;; $i<=3 || last) {
print "$i ";
++$i;
}
输出 1 2 3
. 。如果需要,您可以将增量组合起来:
my $i=1;
for(;; ++$i, $i<=3 || last) {
print "$i ";
}
(使用 ||
因为它具有比 ,
)