The tricky thing here is that do { ... } while (); is not a single syntax like in C. The do {} is one statement (and not a loop, which is a little confusing) and the postfix while just repeats this like any other statement.
Funnily, simple braces { } qualify as a 'loop' which is processed once. It can be aborted using last.
Therefore you could use:
$a = 3;
{
last unless $a == 4;
redo; # if ( ... );
}
which works without an error message. But it isn't very good style. Try to use a normal while loop instead.
Supplement: The perldoc entry for do also gives you the answer and a link to alternative strategies:
do BLOCK
Not really a function. Returns the value of the last c
+ommand in the sequence of commands indicated by BLOCK. When modified
+ by the "while" or "until" loop modifier, executes the BLOCK
once before testing the loop condition. (On other state
+ments the loop modifiers test the conditional first.)
"do BLOCK" does not count as a loop, so the loop contro
+l statements "next", "last", or "redo" cannot be used to leave or res
+tart the block. See [doc://perlsyn] for alternative strategies.
|