Perl解析JSON数据:Dumper输出正常却无法访问哈希值的问题
取值为空的核心原因
变量访问作用域不匹配
Perl 中标量变量$name和哈希变量%name是完全独立的两个变量,哪怕变量名字符串完全相同也不存在任何关联。
你代码中的实际流程是:
- 先声明了空哈希
my %data = (); - 把JSON解码返回的哈希引用赋值给了标量变量
my $data = $json->decode($json_text) - 执行Dumper时传入的是标量
$data(存储了真实JSON结构),所以输出内容完全符合预期 - 但取值时写的
$data{$planet}{Long},本质是在读取最开始声明的空哈希%data,自然取不到任何值。
数据结构层级遗漏
从Dumper的输出可以看到,Mercury键对应的值不是直接存储轨道参数的哈希,而是一个数组引用:
'Mercury' => [ { 'Inclin' => '7.', 'Semi' => '0.8', ... } ]
数组的第0个元素才是存储所有轨道参数的哈希,访问时必须覆盖数组这一层,才能拿到最终的参数值。
正确的访问方式
两种常用写法都可以正常取值:
- 直接操作JSON解码返回的哈希引用
# 接收解码返回的顶级哈希引用 my $root_ref = $json->decode($json_text); my $planet = "Mercury"; # 按结构层级访问:顶级哈希→Mercury键→数组第0位→参数哈希→Long键 my $var = $root_ref->{$planet}[0]{Long};
- 把哈希引用解到实际哈希变量后再访问
# 把顶级哈希引用解到%data中 my %data = %{ $json->decode($json_text) }; my $planet = "Mercury"; # 注意Mercury对应的值是数组,必须加数组索引才能到参数哈希层 my $var = $data{$planet}[0]{Long};
注意:不要把「解码结果赋值给标量引用」和「直接操作空哈希」的写法混用,否则必然取到空值。
内容的提问来源于stack exchange,提问作者user15154955
相关产品推荐
相关产品推荐

