Предполагая, что у вас есть ровно два списка и они имеют одинаковую длину, вот решение, изначально предложенное Мерлином (Рэндал Шварц), который назвал его извращенным perlish:
sub zip2 {
my $p = @_ / 2;
return @_[ map { $_, $_ + $p } 0 .. $p - 1 ];
}
Что происходит здесь, так это то, что для списка из 10 элементов сначала мы находим точку поворота в середине, в данном случае 5, и сохраняем ее в $p
. Затем мы составляем список индексов до этой точки, в данном случае 0 1 2 3 4. Далее мы используем map
для сопряжения каждого индекса с другим индексом, который находится на том же расстоянии от точки поворота, что и первый индекс от начнем, давая нам (в данном случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем фрагмент из @_
, используя его в качестве списка индексов. Это означает, что если 'a', 'b', 'c', 1, 2, 3
передается zip2
, он вернет этот список, перестроенный в 'a', 1, 'b', 2, 'c', 3
.
Это может быть записано в одном выражении вдоль строк ysth, например:
sub zip2 { @_[map { $_, $_ + @_/2 } 0..(@_/2 - 1)] }
Если вы хотите использовать какой-либо вариант, зависит от того, видите ли вы себя, помня, как они работают, но для меня это был расширитель разума.