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..$#_]); }