=over =item redo LABEL X<redo> =item redo EXPR =item redo The L<C<redo>|/redo LABEL> command restarts the loop block without evaluating the conditional again. The L<C<continue>|/continue BLOCK> block, if any, is not executed. If the LABEL is omitted, the command refers to the innermost enclosing loop. The C<redo EXPR> form, available starting in Perl 5.18.0, allows a label name to be computed at run time, and is otherwise identical to C<redo LABEL>. Programs that want to lie to themselves about what was just input normally use this command: # 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; } L<C<redo>|/redo LABEL> cannot be used to retry a block that returns a value such as C<eval {}>, C<sub {}>, or C<do {}>, and should not be used to exit a L<C<grep>|/grep BLOCK LIST> or L<C<map>|/map BLOCK LIST> operation. Note that a block by itself is semantically identical to a loop that executes once. Thus L<C<redo>|/redo LABEL> inside such a block will effectively turn it into a looping construct. See also L<C<continue>|/continue BLOCK> for an illustration of how L<C<last>|/last LABEL>, L<C<next>|/next LABEL>, and L<C<redo>|/redo LABEL> work. Unlike most named operators, this has the same precedence as assignment. It is also exempt from the looks-like-a-function rule, so C<redo ("foo")."bar"> will cause "bar" to be part of the argument to L<C<redo>|/redo LABEL>. =back