appleii has asked for the wisdom of the Perl Monks concerning the following question:

do while loop isn't a really loop? so the loop control statements next, last, or redo cannot be used to leave or restart the block, so the code below will not be complied:
do { last; } while (1);
But this code will be OK:
do { next if (not defined $_); print $_, "\n"; next; } for (1 .. 10);
What's the differentiation between them? And I wonder why the 'do for loop' can work.

Update:

It's a bug or a speciality?

Replies are listed 'Best First'.
Re: do while loop isn't a really loop?
by keszler (Priest) on Nov 12, 2009 at 03:03 UTC
    > perldoc -f do ... "do BLOCK" does *not* count as a loop, so the loop control statements "next", "last", or "redo" cannot be used to leave or restart the block. See perlsyn for alternative strategies.
Re: do while loop isn't a really loop?
by ikegami (Patriarch) on Nov 12, 2009 at 03:03 UTC

    next, last and redo can only be used to leave or restart a loop block. You can't use them in blockless loops like EXPR while EXPR; and EXPR for EXPR;. Remember, do is just another function.

    next, last and redo can't be used to leave or restart a blockless while loop (EXPR while EXPR;). Remember, do is just another function.

    Update: My initial explanation was incorrect. They work with blockless foreach and counting loops (EXPR for EXPR;).

    >perl -wle"print('x'),last while 1; print('y');" x Can't "last" outside a loop block at -e line 1. >perl -wle"print('x'),last for qw(a b c); print('y');" x y
    >perl -wle"do { print('x'); last } while 1; print('y');" x Can't "last" outside a loop block at -e line 1. >perl -wle"do { print('x'); last } for qw(a b c); print('y');" x y

    That's rather inconsistent.

      It's a perl's bug?

        That redo, next and last control blockless for loops? perlsyn could be clearer.

        That redo, next and last don't control blockless while loops? perlsyn is extremely clear on that, but the documentation for redo, next and last could be clearer.