sub zipn { local $[ = 0; [ map { my $index = $_; map { defined($_[$_][$index]) ? $_[$_][$index] : '' } 0..$#_ } 0 .. maximum(map { $#{$_[$_]} } 0..$#_) ] } sub maximum { local $[ = 0; ($#_ == 1) ? ( ($_[0] >= $_[1]) ? $_[0] : $_[1] ) : maximum(maximum($_[0], $_[1]), @_[2..$#_]); } #### zipn([1,2,3], [4,5,6], [7,8,9,10]) #### [1,4,7,2,5,8,3,6,9,'','',10]