Perl将列添加到数组中

时间:2017-07-22 14:36:19

标签: perl

以下数组是数据库查询的结果,我想在Perl中添加一列:

<snip>
foreach my $array_ref ( @stash ) {
    print "@$array_ref\n";
}
<snip>

输出结果:

bash-3.2$ ./test.pl
2014 2 1
2015 2 1
2016 2 1
2017 1 0.5
bash-3.2$

我设法在底部添加一行。例如,通过以下代码:

my @stashSum = ['Sum',  $sumNumDiv, $sumDiv];
push (@stash, @stashSum);

这导致以下结果:

bash-3.2$ ./test.pl
2014 2 1
2015 2 1
2016 2 1
2017 1 0.5
Sum  7 3.5
bash-3.2$

我正在搜索代码,将以下列添加到原始数组:

my $i=0;
foreach my $array_ref ( @stash ) {
    $totalDiv[$i] = $array_ref->[2] * 15;
    print "$totalDiv[$i] \n";   
}

预期结果如下:

bash-3.2$ ./test.pl
2014 2 1 15
2015 2 1 15
2016 2 1 15
2017 1 0.5 7.5
bash-3.2$

有没有办法以与行类似的方式将列“推”到数组上?如果没有,如何将列添加到Perl中的数组?

1 个答案:

答案 0 :(得分:3)

您似乎拥有的是对匿名数组的引用数组,您使用矩阵术语来引用它们,其中列指的是那些匿名数组的元素,行是匿名数组本身。

因此,添加列需要根据在正确位置预先添加,插入或附加其他条目来操纵每个数组。 splice对此类事情很有帮助。

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More;

my $x = [ [1], [2] ]; # Two rows, single column

my @tests = (
    [ sub { push_column($x, 3) },    [     [1,3], [2,3]     ] ],
    [ sub { unshift_column($x, 4) }, [   [4,1,3], [4,2,3]   ] ],
    [ sub { add_column($x, 5, 1) },  [ [4,5,1,3], [4,5,2,3] ] ],
);

for my $case ( @tests ) {
    $case->[0]->();
    is_deeply $x, $case->[1];
}

sub add_column {
    my ($matrix, $v, $col) = @_;
    for my $r ( @$matrix ) {
        splice @$r, $col, 0, $v;
    }
    return;
}

sub push_column {
    add_column(@_, scalar @{ $x->[0] });
    return;
}

sub unshift_column {
    add_column(@_, 0);
    return;
}


done_testing;