Perl:哈希中的数组中的哈希值

时间:2010-11-19 17:05:57

标签: arrays perl hash perl-data-structures

我正在尝试构建一个将数组作为一个值的Hash;这个数组将包含哈希值。不幸的是,我编写了错误,它被解释为伪造的哈希。请帮忙!

my $xcHash       = {};
my $xcLine;

#populate hash header

$xcHash->{XC_HASH_LINES} = ();

#for each line of data
    $xcLine       = {};

    #populate line hash

    push(@{$xcHash->{XC_HASH_LINES}}, $xcLine);

foreach $xcLine ($xcHash->{XC_HASH_LINES})
    #psuedo-hash error occurs when I try to use $xcLine->{...}

4 个答案:

答案 0 :(得分:3)

foreach $xcLine ($xcHash->{XC_HASH_LINES})

应该是

foreach $xcLine ( @{ $xcHash->{XC_HASH_LINES} } )

有关如何取消引用复杂数据结构的规则,请参阅http://perlmonks.org/?node=References+quick+reference

答案 1 :(得分:3)

$xcHash->{XC_HASH_LINES}是一个arrayref而不是数组。所以

$xcHash->{XC_HASH_LINES} = ();

应该是:

$xcHash->{XC_HASH_LINES} = [];

foreach列出一个列表。它可以是包含单个标量(foreach ($foo))的列表,但这不是您想要的。

foreach $xcLine ($xcHash->{XC_HASH_LINES})

应该是:

foreach my $xcLine (@{$xcHash->{XC_HASH_LINES}})

答案 2 :(得分:2)

黄金法则#1

use strict;
use warnings;

一开始看起来似乎是一场斗争,但是他们会灌输良好的Perl实践并帮助识别许多可能会被忽视的语法错误。


此外,Perl还有一个称为autovivification的简洁功能。这意味着$xcHash$xcLine不需要预先定义或构造为对数组或哈希的引用。

这里面临的问题是标量可以包含数组或散列的非常罕见的概念;它没有。它拥有的是一个参考。这意味着$xcHash->{XC_HASH_LINES}是一个arrayref,而不是一个数组,这就是为什么它需要使用@{...}表示法作为数组解除引用。

答案 3 :(得分:0)

这就是我要做的事情:

my %xcHash;

每行数据:

push @{$xcHash{XC_HASH_LINES}},$xcLine;