我正在尝试构建一个将数组作为一个值的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->{...}
答案 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)
use strict;
use warnings;
一开始看起来似乎是一场斗争,但是他们会灌输良好的Perl实践并帮助识别许多可能会被忽视的语法错误。
此外,Perl还有一个称为autovivification的简洁功能。这意味着$xcHash
和$xcLine
不需要预先定义或构造为对数组或哈希的引用。
这里面临的问题是标量可以包含数组或散列的非常罕见的概念;它没有。它拥有的是一个参考。这意味着$xcHash->{XC_HASH_LINES}
是一个arrayref,而不是一个数组,这就是为什么它需要使用@{...}
表示法作为数组解除引用。
答案 3 :(得分:0)
这就是我要做的事情:
my %xcHash;
每行数据:
push @{$xcHash{XC_HASH_LINES}},$xcLine;