加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 将ArrayRef解包为X个独立的参数

发布时间:2020-12-15 23:20:50 所属栏目:大数据 来源:网络整理
导读:给定包含其他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)],]; 我想将每一行
给定包含其他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];
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读