for @$r -> $x, $y { push @$pairs, [$x, $y]; } #### my $r2; my $flipper = 0; for( @$r ) { if( $flipper++ % 2 ) { push @{$r2->[$#{$r2}]}, $_; } else { push @$r2, [ $_ ]; } } #### my %h=(@$r); for (keys %h) { push @$r2, [$_, $h2{$_} ] } # or possibly # push @$r2, [$_, $h2{$_} ] for keys %h #### my $i = 0; my $r2 = map {[ $r->[$i*2], $r->[$i++*2+1] ]} (0 .. $#{$r}/2 - 1); # or (0 .. scalar(@$r)/2 - 1) #### for( my $i=0; $i < scalar @$r; $i += 2 ) { $r2->[$i/2] = [ @$r[$i, $i+1] ] } #### my @copy = @$r; for( @copy ) { push @$r2, [ $_, shift @copy ]; } #### my @copy = @$r; while( @copy ) { push @$r2, [ shift @c, shift @c ]; } #### $r2 = [ map { [$r->[2*$_], $r[2*$_+1]] } 0 .. scalar @$r / 2 - 1 ] #### $r2 = [ map { [@$r[2*$_, 2*$_+1]] } 0 .. scalar @$r / 2 - 1 ] #### @copy = @$r; while (my @pair = splice @copy, 0, 2) { push @$r2, [@pair]; } #### #! /usr/bin/perl -w use strict; use Benchmark qw/cmpthese/; use Data::Dumper; $Data::Dumper::Indent = 0; my $iters = shift || 1000; my $len = shift || 8; sub flipper { my @r2; my $flipper = 0; for( @_ ) { if( $flipper++ % 2 ) { push @{$r2[$#r2]}, $_; } else { push @r2, [ $_ ]; } } \@r2; } sub map_i { my $i = 0; [ map { [$_[$i*2], $_[$i++*2+1]] } (0 .. scalar(@_)/2 - 1) ]; } sub shifter { my @r2; while( @_ ) { push @r2, [ shift @_, shift @_ ]; } \@r2; } sub c_loop { my @r2; for( my $i=0; $i < scalar @_; $i += 2 ) { push @r2, [ @_[$i, $i+1] ] } \@r2; } sub map_pure { [ map{ [$_[$_*2], $_[$_*2+1]] } (0 .. scalar @_ / 2 - 1) ]; } sub aslice { my @r2; $r2[$_] = [ @_[$_*2, $_*2+1] ] for (0 .. scalar @_ / 2 - 1); \@r2; } sub map_jm { [ map { [$_[2*$_], $_[2*$_+1]] } 0 .. scalar @_ / 2 - 1 ]; } sub map_jm2 { [ map { [@_[2*$_, 2*$_+1]] } 0 .. scalar @_ / 2 - 1 ]; } sub splicer { my @r2; while (my @pair = splice @_, 0, 2) { push @r2, [@pair]; } \@r2; } ###################################################### my $r = [ 1 .. $len ]; for my $sub( qw/ flipper shifter splicer c_loop aslice map_i map_pure map_jm map_jm2 /) { no strict 'refs'; # test # print "$sub ", Dumper( &$sub( @$r )), "\n"; } cmpthese( $iters, { flipper => sub { flipper( @$r )}, shifter => sub { shifter( @$r )}, splicer => sub { splicer( @$r )}, c_loop => sub { c_loop( @$r )}, aslice => sub { aslice( @$r )}, map_i => sub { map_i( @$r )}, map_pure => sub { map_pure( @$r )}, map_jm => sub { map_jm( @$r )}, map_jm2 => sub { map_jm2( @$r )}, }, ); __END__