我有一组匿名哈希的引用。从对该数组的引用$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'};
答案 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}
现在,我认为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.