in reply to a little zip()

Here's one which zip()s an arbitrary number of arrays. If any of the arrays don't have enough elements, we pad with the empty string, cos that's what I needed at the time. Changing it to emit undefs would be trivial:
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..$#_]); }
Call it like so:
zipn([1,2,3], [4,5,6], [7,8,9,10])
and it'll return this:
[1,4,7,2,5,8,3,6,9,'','',10]
That maximum() function is a bit silly, getting rid of the recursion would make it way more efficient, but I firmly believe that "to recurse is divine".