Larry Wall wrote:

> On 20 Sep 2002, Aaron Sherman wrote:
> 
> : Does that mean that I can't
> : 
> :         for $x -> $_ {
> :             for $y -> $z {
> :                     print "$_, $z\n";
> :             }
> :         }
> : 
> : And expect to get different values?
> 
> That's correct.  Name the outer topic explicitly, not the inner one.

That makes sense for nested C<for> loops: avoid confusion by always
having the 'unlabelled' entity being the thing being dealt with right
now.

Is it as helpful for file input?  Many Perl programs use C<$_> to mean
'the current line'.  'A2' gives the Perl 6 syntax for this as:

   while $STDIN {

That C<while> loop may be quite long.  Maybe somewhere in the middle of
it, it's necessary to have a C<for> loop iterating over something else.
Or we want to switch on some state:

  given $who
  {
    when $us   { push %line{us}, $_ }
    when $them { $num_them++ }
    default    { warn "$_\n" if $DEBUG }
  }

I think it could surprise people if the variable holding 'the current
line' no longer holds that inside the C<for> or C<given>.

Having to alias C<$current_line> to C<$_> around inner loops and
switches is messy, and potentially confusing -- the same value now has
different names in different places.

Presumably something like this will be valid to use a different name for
the current line:

  while defined my $line = $STDIN {

By C<$line> is just an ordinary variable in there, not a topic.  So we
lose the benefits of being able to perform matches and substitutions
directly on the current line without having to name it or type the C<=~>
operator explicitly.

So I'm unconvinced that having an explicitly named topic always also
clobbering C<$_> is a good idea.  But if it is, then we need a simple
syntax for reading file input lines into an explicitly named topic.

Smylers

Reply via email to