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

解码JSON哈希后访问数组元素的疑问:为何需两层索引?

Perl JSON解析后数组访问异常问题解析

问题代码

#!/opt/local/bin/perl

use strict;
use warnings;

use JSON::XS qw/decode_json/;

my $api_response = '{"user":{"id":14897,"data":["foo", "bar", "baz"]}}';
my $user = decode_json($api_response);
$user = $user->{user};

my @data = $user->{data};

print($user->{id}, "\n");  # output: 14897
print("@data", "\n");      # output: ARRAY(0x14200d9b8)
print($data[0], "\n");     # output: ARRAY(0x14200d9b8) why???
print($data[0][0], "\n");  # output: foo

问题描述

这段代码可正常运行,但需通过两层索引才能访问$data的元素,原本预期@data是简单字符串数组,请问这是预期行为还是代码存在问题?

问题解析与解决方案

这是代码问题,核心问题出在数组赋值语句:

my @data = $user->{data};

JSON::XS会将JSON中的数组解析为Perl的数组引用(本质是标量类型)。当你把单个标量(数组引用)赋值给数组@data时,Perl会将这个标量作为数组的第一个元素存入,最终@data是一个包含数组引用的数组(结构为[ $array_ref ]),所以需要两层索引才能访问原数组的元素。

正确写法

需要对数组引用进行解引用,将其转化为普通数组,常用两种方式:

  1. 标准解引用语法:
my @data = @{ $user->{data} };
  1. Perl 5.24及以上支持的后置解引用语法:
my @data = $user->{data}->@*;

修改后,@data会成为包含"foo", "bar", "baz"的普通字符串数组,直接使用$data[0]即可访问第一个元素,输出foo。


内容的提问来源于stack exchange,提问作者miken32

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:16:25