http://qs321.pair.com?node_id=908012


in reply to Processing pairs of values from even-sized array

I'd normally use a slightly simpler version of JohnGG's splice approach. Something like

my @arr = qw/1 2 3 4 5 6 7 8/; while(my ($x,$y) = splice @arr,0,2) { say "$x => $y"; }

Something I've needed in the past was to get two arrays (odds and evens). Grep can do this. You could combine them into a hash thus:

my @arr = qw/1 2 3 4 5 6 7 8/; my ($j,$i)=(0,0); my ($x,$y) = ([grep { ++$i % 2} @arr] , [grep {$j++ % 2} @arr]); my %hash; @hash{@{$x}}=@{$y}; for(keys %hash) { say "$_ => $hash{$_}" }
Gives us:
1 => 2 3 => 4 7 => 8 5 => 6
Or you could iterate them (which is safer if some x may be undef)
my @arr = qw/1 2 3 4 5 6 7 8/; push @arr, undef; push @arr, 9; my ($j,$i)=(0,0); my ($x,$y) = ([grep { ++$i % 2} @arr] , [grep {$j++ % 2} @arr]); $i=0; for(@{$x}){ say $_ ." => " . $y->[$i++] if($_); }
Obviously that doesn't scale to big arrays. I'm sure List::MoreUtils is always the better approach.