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
參數的一部分。