This and other RFCs are available on the web at
  http://dev.perl.org/rfc/

=head1  TITLE

Allow multiple loop variables in foreach statements

=head1  VERSION

      Maintainer: Peter Scott <[EMAIL PROTECTED]>
      Date: 29 Aug 2000
      Last Modified: 6 Sep 2000
      Mailing List: [EMAIL PROTECTED]
      Version: 2
      Number: 173
      Status: Frozen

=head1  ABSTRACT

Allow for a list of loop variables in for(each) statements, i.e. & e.g.,

      foreach my ($x, $y, $z) (@list) { ... }

=head1  DESCRIPTION

This has been raised by several people in the past, most recently on the
perl6-* lists by Graham Barr, who does not have time to RFC it
currently.  The semantics are (hopefully) obvious: where

      foreach $var (@list)

iterates through C<@list>, assigning C<$var> to each element in turn,

      foreach ($var_1, ... $var_n) (@list)

iterates through C<@list> n elements at a time, assigning C<$var_1> through
C<$var_n> to them respectively.  If the number of elements in C<@list> is
not evenly divisible by n, the remaining loop variables on the last
iteration become C<undef>.

The most obvious usefulness is traversing a hash which has been passed in
an argument list:

      sub foo {
          foreach my($key, $value) (@_) { ... }
      }
      foo(%hash);

instead of having to make a temporary copy:

      sub foo {
          my %h = @_;
          while (my ($key, $value) = each %h) { ... }
      }

This extension does not apply to the C<foreach> statement I<modifier>,
since that doesn't accept a loop variable anyway.

=head2 Alternatives

While C<splice> is frequently adduced as an alternative, this requires an
array instead of just a list, and is destructive to boot.

=head1  IMPLEMENTATION

The potential parsing difficulty I came up with was how to tell that

      foreach ($a,$b,$c) (@list) ...

was not

      foreach $_ ($a, $b, $c) (@list) ...

Graham tells me that the required parentheses and block braces make it
possible for the parser to be able to tell the difference.  John Porter
suggests an alternative syntax

     foreach [$a, $b, $c] (@list)

which could be employed instead if there is a parsing problem.

=head1  REFERENCES

L<perlsyn/"Foreach Loops">

Reply via email to