# Re: Support for ensuring invariants from one loop iteration to the next?

`Like I said: if the goto approach works for you, more power to you.  Me, I find:`
```
loop {
@stuff = grep { \$_->valid } @stuff;
TEST: last unless @stuff;

\$_->do_something( ++\$i ) for @stuff;
}

to be at least as straightforward as:

goto INVARIANT;

while ( @stuff ) {
\$_->do_something( ++\$i ) for @stuff;

INVARIANT:
@stuff = grep { \$_->valid } @stuff;
}

It strikes me as being more concise; and the use of the (superfluous)
label makes the position and significance of the "last unless..." line
stand out.

I'm not telling you that you're wrong; TIMTOWTDI.  I'm telling you
that it's a matter of taste.

On Fri, Dec 19, 2008 at 5:52 AM, Aristotle Pagaltzis <pagalt...@gmx.de> wrote:
> * Jon Lang <datawea...@gmail.com> [2008-12-19 03:50]:
>> Personally, it doesn't strike me as being as straightforward
>> as putting a "last unless" clause into the middle of an
>> otherwise-infinite loop
>
>
>    while(1) {
>        # ...
>        last if \$foo;
>    }
>
>
>    while(\$foo) {
>        # ...
>    }
>
> The goto in the code I gave happens just once and doesn't modify
> the loop semantics. Basically, any one point in the code I gave
> can be read in isolation, and is "locally complete" (I don't know
> how to say this better), whereas in the infinite loop the overall
> effect of certain points is depenent on other points.
>
> In Schwern's terms, goto'ing into the middle of a terminating
> loop is more skimmable than last'ing out of the middle of an
> infinite loop.
>
> Regards,
> --
> Aristotle Pagaltzis // <http://plasmasturm.org/>
>

--
Jonathan "Dataweaver" Lang
```