redo LABEL
redo EXPR
redo

redo 命令重新启动循环块,而不重新评估条件。continue 块(如果有)不会执行。如果省略 LABEL,该命令将引用最内层封闭的循环。redo EXPR 形式(从 Perl 5.18.0 开始提供)允许在运行时计算标签名,并且在其他方面与 redo LABEL 相同。想要对自己撒谎的程序通常会使用此命令

# a simpleminded Pascal comment stripper
# (warning: assumes no { or } in strings)
LINE: while (<STDIN>) {
    while (s|({.*}.*){.*}|$1 |) {}
    s|{.*}| |;
    if (s|{.*| |) {
        my $front = $_;
        while (<STDIN>) {
            if (/}/) {  # end of comment?
                s|^|$front\{|;
                redo LINE;
            }
        }
    }
    print;
}

redo 无法从通常返回值的块中返回值,例如 eval {}sub {}do {}。它将执行其流控制行为,从而排除任何返回值。不应使用它来退出 grepmap 操作。

请注意,一个块本身在语义上与执行一次的循环相同。因此,此类块中的 redo 将有效地将其变成一个循环构造。

另请参阅 continue,了解 lastnextredo 的工作原理。

与大多数命名操作符不同,此操作符具有与赋值相同的优先级。它还免除了类似于函数的规则,因此redo ("foo")."bar"将使“bar”成为redo参数的一部分。