假设您恰好有两个列表并且它们的长度完全相同,这是 merlyn (Randal Schwartz) 最初提出的一个解决方案,他将其称为 perverse 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)] }
你是否想使用任何一种变体取决于你是否能看到自己记住它们是如何工作的,但对我来说,这是一个思维扩展器。