无法理解Perl多维哈希引用:报错‘Not a HASH reference’
解决Perl中"Not a HASH reference"错误:多层哈希引用的正确写法
你的问题出在创建哈希引用的方式上——你生成的是指向哈希引用的引用(REF类型),而非直接的哈希引用,这导致解引用时触发错误。
错误原因分析
你写的代码:
my $ref = \( %date2solveInfo{ $weekDate}->{$dow});
这里的\%是取哈希的引用,但$date2solveInfo{$weekDate}->{$dow}本身已经是一个哈希引用(多维哈希的每一层都是引用),所以你相当于给一个哈希引用又套了一层引用,最终$ref是REF类型,不是HASH类型。
从调试器输出也能明确看出:
DB<3> x $ref 0 REF(0x7faaea208ef8) -> HASH(0x7faaec193f20) 'secs' => 2272
REF(...) -> HASH(...)显示$ref是指向哈希引用的引用,而非直接的哈希引用。当你尝试$ref->{"secs"}时,Perl期望$ref是HASH引用,但实际是REF类型,因此报错。
正确写法
直接获取多层哈希的最后一层引用即可,不需要额外加\:
# 两种写法等价,Perl会自动处理箭头的解引用 my $ref = $date2solveInfo{$weekDate}->{$dow}; # 或者更简洁的写法 my $ref = $date2solveInfo{$weekDate}{$dow};
此时调试器查看$ref会直接显示哈希引用:
DB<3> x $ref 0 HASH(0x7faaec193f20) 'secs' => 2272
执行p $ref->{"secs"}就能正常输出2272。
临时修复(如果已创建错误引用)
如果已经生成了REF类型的$ref,可以通过两次解引用访问值:
p $$ref->{"secs"};
但这只是临时 workaround,推荐直接用正确的方式获取哈希引用。
内容的提问来源于stack exchange,提问作者ericgbirder
相关产品推荐
相关产品推荐

