0

我已经构建了一个包含数组数组的哈希,我们称之为 %hash_multidim,这样 Data::Dumper 的输出如下所示:

      'Key1' => [
                   [
                     '-3.81',
                     '-1.91',
                     '-1.86',
                     '-1.70'
                   ],
                   [
                     '1.35',
                     '1.04',
                     '-1.01',
                     '-2.69'
                   ]
                 ],
      'Key2' => [
                    [
                      '-1.63'
                    ],
                    [
                      '-1.17'
                    ]
                  ],

现在,我想在这个结构的最底层访问和执行操作。例如,对于“Key1”,我想找到第 1 行的平均值(也就是 [0] 处数组的平均值)。使用 List::Util qw(sum),我编写了一个名为 mean 的子程序:

sub mean {
    return sum(@_)/scalar(@_);
}

但是,如果使用子程序,例如:

my $test = mean($hash_multidim{Key1}[0]);
print $test;

我没有得到我所期望的。事实上,我得到:

43678288

我哪里做错了?如果我尝试评估结果

$hash_multidim{Key1}[0]

一切看起来都很干净。例如,

@test2 = $hash_multidim{Key1}[0];
print Dumper(\@test2);

产生这个输出:

$VAR1 = [
          [
            '-3.81',
            '-1.91',
            '-1.86',
            '-1.70'
          ]
        ];
4

2 回答 2

4

$hash_multidim{Key1}[0]是一个数组引用,但mean需要一个列表。所以你只需要“取消引用”它。语法有点棘手,但它是

my $test = mean( @{$hash_multidim{Key1}[0]} );
于 2013-08-19T20:44:10.463 回答
3

$hash_multidim{Key1}[0]是一个标量,其值是对数组的引用。mean当您打算传递引用数组的元素的值时,您将传递该单个标量。

my $test = mean( @{ $hash_multidim{Key1}[0] } );


注意:除法运算符不能除以列表,只能除以数字。因此,它在其操作数上强加了一个标量上下文。你的使用scalar是多余的。你可以简单地使用

sub mean { sum(@_)/@_ }
于 2013-08-19T20:47:18.310 回答