根据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(;;) 最近。在我的基本测试中,有条件表达 AB, ,您想做什么:

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 ";
}

(使用 || 因为它具有比 ,)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top