The following chunks behave the same in Perl 5.6 as in Perl 5.8.  Notice the 
output of "branching" statement modifiers vs. "looping" statement modifiers. 

perl -e '$f=1; {local $f=2; print "$f"} print " - $f\n"'
  # prints 2 - 1

perl -e '$f=1; {local $f=2 if 1; print "$f"} print " - $f\n"
  # prints 2 - 1

perl -e '$f=1; {local $f=2 unless 0; print "$f"} print " - $f\n"''
  # prints 2 - 1

perl -e '$f=1; {local $f=2 for 1; print "$f"} print " - $f\n"'
  # prints 1 - 1

perl -e '$f=1; {local $f=2 until 1; print "$f"} print " - $f\n"'
  # prints 1 - 1

perl -e '$f=1; {local $f=2 while !$n++; print "$f"} print " - $f\n"'
  # prints 1 - 1

It appears that there is an implicit block around statements with looping 
statement modifiers.  perlsyn does state that the control variables of the 
"for" statement modifier are locally scoped, but doesn't really mention that 
the entire statement is as well.  I'm not sure if this was in the original 
design spec or if it flowed out of the implementation details, but either way 
it seems to represent an inconsistency in the treatment of locality with 
regards to braces (ok I guess there are several in Perl5).

So the question is, what will it be like for Perl6.  It would seem that all of 
the following should hold true because of scoping being tied to the blocks.

pugs -e 'our $f=1; {temp $f=2; print $f}; say " - $f"'
   # should print 2 - 1 (currently prints 2 - 2 - but that is a compiler 
issue)

pugs -e 'our $f=1; {temp $f=2 if 1; print $f}; say " - $f"'
   # should print 2 - 1 (currently dies with parse error)

pugs -e 'our $f=1; {temp $f=2 for 1; print $f}; say " - $f"'
   # hopefully prints 2 - 1 (currently dies with parse error)

As a side note - pugs does work with:

pugs -e 'our $f=1; {$f=2 for 1; print $f}; say " - $f"'
  # prints 2 - 2 (as it should.  It seems that statement modifiers don't 
currently work with declarations - but that is a compiler issue - not a 
language issue.)

I have wanted to do this in Perl5 but couldn't but would love to be able to do 
in Perl6:

my %h = <a 1 b 2 c 3>;
{
  temp %h{$_} ++ for %h.keys;
  %h.say; # values are incremented still
}
%h.say; # values are back to original values

Paul

Reply via email to