在Perl中,如何从hashrefs数组中的引用中访问值?

时间:2009-10-26 23:44:54

标签: perl reference

我有一组匿名哈希的引用。从对该数组的引用$allDirArray,我想访问与键'dir'对应的值。目前我收到错误:

Can't use string ("HASH(0x100878050)") as a HASH ref while "strict refs" 
in use at nameOfProgram.pl line 148.

我的代码:

my $tempDir = ${$allDirArray}[$i]{'dir'};

5 个答案:

答案 0 :(得分:6)

错误消息表明您实际上尝试使用字符串“HASH(0x100878050)”作为hashref。所以我怀疑你已经设法将你的哈希字符串化(即,你将它们用作字符串,而Perl将它们变成了字符串)。可能发生这种情况的一种方法是将hashref分配给散列键(散列键只能是字符串),或者通过引用类似$array[0] = "$hashref"的赋值中的变量。

因此${$allDirArray}[$i]内部是一个包含“HASH(0x100878050)”的字符串,字面意思是字符串。不是哈希。

最好的办法是确认这可能是为了转储数据结构。您可以使用Data::Dumper执行此操作:

use Data::Dumper;
print Dumper($allDirArray);

答案 1 :(得分:3)

 $allDirArray->[$i]->{dir}

请参阅perldoc perlreftut

现在,我认为Dan可以正确诊断您的问题。因此,常见问题解答What's wrong with always quoting "$vars"?可能会有所帮助。

答案 2 :(得分:2)

我真的看不出你引用的代码有什么问题,所以我写了一个简短的测试脚本并通过Perl传递它。

#! perl
use warnings;
use strict;

my $allDirArray = [{dir => "b"},{c => "d"}];
my $i = 0;
my $tempDir = ${$allDirArray}[$i]{'dir'};
print "$tempDir\n";

如上所述,在Cygwin上使用Perl 5.10,程序运行如下:

$ perl allarraydir.pl
b

未打印任何错误消息。见http://codepad.org/pH4eyMlt

修改

在包含了telemachus的建议之后,我在上述程序的末尾添加了以下代码,

# The following addition was included re telemachus's comment
my @allDirArray2 = ({dir => "b"},{c => "d"});
$tempDir = ${$allDirArray2}[$i]{'dir'};
print "$tempDir\n";

再次运行它并收到以下错误消息:

$ perl allarraydir.pl
Global symbol "$allDirArray2" requires explicit package name at 
allarraydir.pl line 10.
Execution of allarraydir.pl aborted due to compilation errors.

(这应该是对你的问题的评论,而不是答案,但代码太长了。)

答案 3 :(得分:0)

$$allDirArray[$i]->{'dir'}

答案 4 :(得分:0)

不知怎的,你设法将你的匿名哈希变成了一个字符串。

以下是导致该错误的简短示例。

use strict;
use warnings;

my $allDirArray = [ ''.{ 'dir' => 'somedir' } ];

my $tempdir = ${$allDirArray}[0]{'dir'};
# or
my $tempdir = $allDirArray->[0]{'dir'};
Can't use string ("HASH(0x8555168)") as a HASH ref while "strict refs" in use at nameOfProgram.pl line 8.