Search code examples
perlloops

How do I read two items at a time in a Perl foreach loop?


What I'm looking for is something like:

@list = qw(1 2 3 4 5 6);
foreach (@list) {
  #perl magic goes here 
  print "i: $i, j:$j\n";
}

returns:

i:1, j:2
i:3, j:4
i:5, j:6

In response to a very good suggestion below, I need to specify that this script will run on someone else's build server, and I'm not allowed to use any modules from CPAN. Standard Perl only.


Solution

  • I believe the proper way to do this is to use natatime, from List::MoreUtils:

    from the docs:

    natatime BLOCK LIST

    Creates an array iterator, for looping over an array in chunks of $n items at a time. (n at a time, get it?). An example is probably a better explanation than I could give in words.

    Example:

     my @x = ('a' .. 'g');
     my $it = natatime 3, @x;
     while (my @vals = $it->())
     {
         print "@vals\n";
     }
    

    This prints

    a b c
    d e f
    g
    

    The implementation of List::MoreUtils::natatime:

    sub natatime ($@)
    {
        my $n = shift;
        my @list = @_;
    
        return sub
        {
            return splice @list, 0, $n;
        }
    }