微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有一个优雅的拉链交织在Perl 5的两个列表?

我最近“需要”一个zip函数在Perl 5(而我正在考虑大约 How do I calculate relative time?),即一个函数,需要两个列表和“拉链”他们在一起列表,交织元素。

(伪)示例:

@a=(1,2,3);
@b=('apple','orange','grape');
zip @a,@b; # (1,'apple',3,'grape');

Haskell has zip in the PreludePerl 6 has a zip operator内置,但是你如何在Perl 5中以优雅的方式做呢?

解决方法

假设你有两个列表,它们的长度完全相同,这里是一个由merlyn(Randal Schwartz)最初的解决方案,他将其称为periter:
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)] }

是否要使用这两种变体取决于你是否能够看到自己记住它们是如何工作的,但对我来说,这是一个思维扩展器。

原文地址:https://www.jb51.cc/Perl/173293.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐