当我尝试访问哈希元素时,为什么会出现“无法将字符串用作HASH ref”错误?

时间:2009-08-12 17:55:37

标签: perl

如何解决此错误?

foreach (values %{$args{car_models}}) {
   push(@not_sorted_models, UnixDate($_->{'year'},"%o"));
}

错误: 在/.../BMW.pm第222行使用“strict refs”时,不能使用字符串(“1249998666”)作为HASH引用。

3 个答案:

答案 0 :(得分:14)

Data::Dumper模块在​​这种情况下非常有用 - 帮助您找出复杂数据结构无法满足您期望的原因。例如:

use Data::Dumper;
print Dumper(\%args);

答案 1 :(得分:11)

显然,%{ $args{car_models} }中的一个值不是哈希引用。也就是说,数据结构不包含您的想法。因此,您可以修复数据结构或更改代码以匹配数据结构。由于您尚未提供数据结构,我无法对此发表评论。

在尝试访问成员之前,您可以使用ref查看$_是否包含对哈希的引用。

if ( ref eq 'HASH' and exists $_->{year} ) {
    push(@not_sorted_models, UnixDate($_->{year},"%o")); 
}

根据你的评论和我的ESP权力,我假设这些值是时间戳。所以,我猜,你试图从时间戳值(一个纪元的秒数​​)中找到年份。在这种情况下,您可能需要localtimegmtime

my $year = 1900 + (localtime)[5];
C:\Temp> perl -e "print 1900 + (localtime(1249998666))[5]"
2009

如果没有进一步的具体信息,关于你的数据结构应该包含什么,这是我最好的猜测。

答案 2 :(得分:0)

嗨,如果你有一个哈希引用变量(比如$ hash_ref)那么代码将是

if ( ref($hash_ref) eq 'HASH' and exists $hash_ref->{year} ) {
    push(@not_sorted_models, UnixDate($hash_ref->{year},"%o")); 
}
#instead of below:
if ( ref eq 'HASH' and exists $_->{year} ) {
    push(@not_sorted_models, UnixDate($_->{year},"%o")); 
}

谢谢, Manoj Shekhawat