in reply to "last" not really outside loop block

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.

Replies are listed 'Best First'.
Re^2: "last" not really outside loop block
by spx2 (Deacon) on Jun 22, 2009 at 15:55 UTC
    Try to use a normal while loop instead.

    I kind of need the post-condition and while only gives me pre-condition

      Try the follwing:

      Instead of:

      do { ... } while (expr);
      use:
      while (1) { ... last unless (expr); }