ちょうど 2 つのリストがあり、それらがまったく同じ長さであると仮定すると、元は merlyn (Randal Schwartz) による解決策です。
sub zip2 {
my $p = @_ / 2;
return @_[ map { $_, $_ + $p } 0 .. $p - 1 ];
}
ここで何が起こるかというと、10 要素のリストの場合、最初に中間点 (この場合は 5) でピボット ポイントを見つけて、それを に保存し$p
ます。次に、その時点までのインデックスのリストを作成します。この場合は 0 1 2 3 4 です。次に、map
各インデックスを、ピボット ポイントから最初のインデックスと同じ距離にある別のインデックスとペアにして、次のようにします。 us (この場合) 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)] }
どちらのバリエーションを使用するかは、それらがどのように機能するかを覚えているかどうかによって異なりますが、私にとっては、それはマインドエキスパンダーでした.