1

我正在尝试构建一个将数组作为一个值的哈希;然后这个数组将包含哈希。不幸的是,我把它编码错了,它被解释为一个伪散列。请帮忙!

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

4 回答 4

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

应该

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

请参阅http://perlmonks.org/?node=References+quick+reference以轻松记住如何取消引用复杂数据结构的规则。

于 2010-11-19T17:16:11.447 回答
3

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

$xcHash->{XC_HASH_LINES} = ();

应该:

$xcHash->{XC_HASH_LINES} = [];

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

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

应该:

foreach my $xcLine (@{$xcHash->{XC_HASH_LINES}})
于 2010-11-19T17:22:06.070 回答
2

黄金法则#1

use strict;
use warnings;

一开始这似乎是一场战斗,但它们将灌输良好的 Perl 实践并帮助识别许多否则可能会被忽视的语法错误。


此外,Perl 有一个简洁的特性,称为自动激活。这意味着不需要预先定义或构造为对数组或哈希的引用$xcHash$xcLine

这里面临的问题与标量可以保存数组或散列的常见概念有关。它没有。它所持有的是一个参考。这意味着它$xcHash->{XC_HASH_LINES}是一个arrayref,而不是一个数组,这就是为什么需要使用该@{...}符号将它作为一个数组解引用。

于 2010-11-19T17:26:49.390 回答
0

这是我要做的:

my %xcHash;

对于每一行数据:

push @{$xcHash{XC_HASH_LINES}},$xcLine;
于 2010-11-19T17:10:26.353 回答