我已经构建了一个包含数组数组的哈希,让我们称之为%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'
]
];
答案 0 :(得分:4)
$hash_multidim{Key1}[0]
是一个数组引用,但mean
需要一个列表。所以你只需要“取消引用”它。语法有点棘手,但它是
my $test = mean( @{$hash_multidim{Key1}[0]} );
答案 1 :(得分:3)
$hash_multidim{Key1}[0]
是一个标量,其值是对数组的引用。当您要传递引用数组的元素值时,您将该单个标量传递给mean
。
my $test = mean( @{ $hash_multidim{Key1}[0] } );
注意:除法运算符不能除以列表,只能用数字除。因此,它在其操作数上强加了标量上下文。您对scalar
的使用是多余的。你可以简单地使用
sub mean { sum(@_)/@_ }