On Fri, Dec 19, 2008 at 01:47:08AM +0100, Aristotle Pagaltzis wrote: : And I just realised how to best do that in Perl 5: : : goto INVARIANT; : : while ( @stuff ) { : $_->do_something( ++$i ) for @stuff; : : INVARIANT: : @stuff = grep { $_->valid } @stuff; : } : : I am not sure why this works, to be honest. That is, I don’t know : whether it’s an intentional or accidental feature that execution : doesn’t merely fall off the end of the loop body after jumping : into the middle of it, but loops back to the top, despite not : having executed the `while` statement first. : : But it does work. : : And it says exactly what it’s supposed to say in the absolutely : most straightforward manner possible. The order of execution is : crystal clear, the intent behind the loop completely explicit.
It is specced to work correctly in Perl 6 as well. The policy (shared with Perl 5) is that you may use goto into any loop that doesn't depend on an initializer. It's illegal to go into a for 1..10 loop, for instance, since the loop won't be initialized correctly. Larry