#! /usr/bin/perl use strict; use warnings; use Benchmark 'cmpthese'; use List::MoreUtils 'zip'; # Hands up if you can predict the result? :) sub zip1 { my @list1 = @{shift()}; my @list2 = @{shift()}; my @zip; while (@list1+@list2) { push(@zip, shift(@list1), shift(@list2)); } @zip } sub zip2 { my( $r1, $r2 ) = @_; map { $r1->[ $_ ], $r2->[ $_ ] } 0 .. ( $#$r1 > $#$r2 ? $#$r1 : $#$r2 ); } for my $length (10, 1000, 10000000) { my @a = 1 .. $length; my @b = reverse @a; print "For $length elements:\n"; cmpthese(-10, { copy => 'zip1 \@a, \@b', deref => 'zip2 \@a, \@b', CPAN => 'zip @a, @b', }); print "\n"; }