my @a = 1..3; my @b = qw( a b c ); my @foo = orig_zip( \@a, \@b ); my @bar = fixed_zip( \@a, \@b ); print Data::Dumper->Dump( [ \@foo, \@bar ], [ 'original', 'fixed' ] ); sub orig_zip { my( $r1, $r2 ) = @_; map { $r1->[ $_ ], $r2->[ $_ ] } 0 .. ( @$r1 > @$r2 ? @$r1 : @$r2 ); } sub fixed_zip { my( $r1, $r2 ) = @_; map { $r1->[ $_ ], $r2->[ $_ ] } 0 .. ( $#$r1 > $#$r2 ? $#$r1 : $#$r2 ); } __END__ $original = [ 1, 'a', 2, 'b', 3, 'c', undef, undef ]; $fixed = [ 1, 'a', 2, 'b', 3, 'c' ];