给定包含其他arrayrefs的arrayref,是否可以使用
List::MoreUtils
中的zip函数将嵌套的arrayrefs压缩在一起?
比如给出这个arrayref:
my $matrix = [ [qw( 1 2 3 4)],[qw( 5 6 7 8)],[qw( 9 10 11 12)],[qw(13 14 15 16)],[qw(17 18 19 20)],];
我想将每一行压缩在一起,这样我就可以进行转置.预期产量:
[ [qw(1 5 9 13 17)],[qw(2 6 10 14 18)],[qw(3 7 11 15 19)],[qw(4 8 12 16 20)],];
我最初的尝试是:
# I had hoped the function would unpack the arguments zip @$matrix; # ERROR: Not enough arguments for List::MoreUtils::mesh at spiral.pl line 17 # I thought this slice would suffice to unpack them zip @$matrix[1..scalar @$matrix-1]; # ERROR: Type of arg 1 to List::MoreUtils::mesh must be array (not array slice)
我确信有一种方法可以优雅地做到这一点,我只是没有看到它.任何帮助,将不胜感激.
解决方法
拉链功能非常烦人,因为它使用
a
(\@\@;\@\@\@...)
prototype或类似疯狂的东西.你必须做一个&符号来覆盖原型:& zip(@ $matrix).
但是,你试图转置矩阵,而不是拉链(这将生成一个连续的列表,如
[1,5,9,13,17,2,6,10,14,18,3,7,11,15,19,4,8,12,16,20]
我们可以将natatime迭代器与zip结合使用:
my $iter = natatime @$matrix,&zip(@$matrix); my @transposed; while (my @column = $iter->()) { push @transposed,\@column; }
哪个有效,但这严重地过分了问题.我们只是交换指数:
my $transposed = []; for my $i (0 .. $#$matrix) { for my $j (0 .. $#{ $matrix->[0] }) { $transposed->[$j][$i] = $matrix->[$i][$j]; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。