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 {}
。它将执行其流控制行为,从而排除任何返回值。不应使用它来退出 grep
或 map
操作。
请注意,一个块本身在语义上与执行一次的循环相同。因此,此类块中的 redo
将有效地将其变成一个循环构造。
另请参阅 continue
,了解 last
、next
和 redo
的工作原理。
与大多数命名操作符不同,此操作符具有与赋值相同的优先级。它还免除了类似于函数的规则,因此redo ("foo")."bar"
将使“bar”成为redo
参数的一部分。