On Tue, May 07, 2002 at 03:15:48PM +0100, Graham Barr wrote:
> 
>  LAST   Executes on implicit loop exit or call to last()
>       Loop variables may be unknown

Not exactly "unknown". It's just that, in a few cases, their values may
have changed by the time the LAST block is executed.

> And I think this thread is proposing
> 
>  FIRST         A PRE block that is executed only on the first itteration
>        of the loop
> 
>  BETWEEN A PRE block that does not execute for the first iteration
>        of the loop.
> 
> So FIRST and BETWEEN are just shorthand for
> 
>  my $count;
>  loop {
>    PRE {
>      if ($count++) {
>        # BETWEEN code here
>      }
>      else {
>        # FIRST code here
>      }
>    }
>  }

Almost. What people are pushing for is more like:

 BETWEEN A NEXT block that does not execute for the last iteration
         of the loop.

 my $count;
 loop {
   PRE {
     unless ($count++) {
       # FIRST code here
     }
   }
   NEXT {
     if (<the loop will execute again>) {
       # BETWEEN code here
     }
 }

This may seem like a trivial difference at first glance, but it's a
matter of scope. The latter interpretation means that code such as:

        for 1..3 -> $thing {
                print $thing _ ", ";

                BETWEEN {
                        print $thing _ "\n";
                }
        }

Will output:
1, 1
2, 2
3,

Not:
1, 2
2, 3
3,

Which seems intuitively right. 

It's only with variables lexically scoped outside the loop and that
change values in the condition itself that we encounter Damian's
conundrum.

Allison

Reply via email to