in reply to interleave (single shuffle)

I think this may be a bit more understandable (as it uses one fewer tricks):
sub zip { my $half = @_>>1; return @_[map { ($_&1 && $half) + ($_>>1) } 0 .. $#_]; }
or
sub zip { my $half = @_>>1; return @_[map { $_, $_+$half } 0 .. $half-1]; }

p.s. A common name for this kind of functionality is "zip". See Language::Functional for an implementation. SO I changed the name for the function to reflect this.