解码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 ]),所以需要两层索引才能访问原数组的元素。
正确写法
需要对数组引用进行解引用,将其转化为普通数组,常用两种方式:
- 标准解引用语法:
my @data = @{ $user->{data} };
- Perl 5.24及以上支持的后置解引用语法:
my @data = $user->{data}->@*;
修改后,@data会成为包含"foo", "bar", "baz"的普通字符串数组,直接使用$data[0]即可访问第一个元素,输出foo。
内容的提问来源于stack exchange,提问作者miken32
相关产品推荐
相关产品推荐

