如何访问数组数组的Perl Hash中的值?

时间:2013-08-19 20:39:21

标签: perl hash multidimensional-array reference

我已经构建了一个包含数组数组的哈希,让我们称之为%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'
          ]
        ];

2 个答案:

答案 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(@_)/@_ }