You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 02:15:01