Perl访问XML转JSON后的端口邻居WWN值时出现哈希引用错误求助
Perl访问XML转JSON后的端口邻居WWN值时出现哈希引用错误求助
看起来你踩了XML转JSON时常见的一个坑——数据结构不一致!当neighbor为空时代码没问题,但有实际数据时,wwn是一个数组引用,而你代码里把它当成了哈希引用去访问,这就是触发Not a HASH reference错误的原因。
先看你输出的Dumper结果:
$VAR1 = {
'wwn' => [
{
'$t' => 'xxx'
},
{
'$t' => 'yyy'
},
{
'$t' => 'zzz'
}
]
};
这里的wwn是数组([]标识),里面每个元素才是包含$t的哈希。但你的代码里直接写了$PORTS[$PORT]->{'neighbor'}->{'wwn'}->{'$t'},相当于把数组引用当成哈希来用,Perl当然会报错啦!
给你修改后的代码,同时兼容wwn是单个哈希(可能单个WWN的情况)和数组(多个WWN的情况):
for my $PORT (0..$#PORTS) { print Dumper $PORTS[$PORT]->{'neighbor'}; # 先检查neighbor里是否存在wwn这个键 if (exists $PORTS[$PORT]->{'neighbor'}->{'wwn'}) { my $wwn_container = $PORTS[$PORT]->{'neighbor'}->{'wwn'}; # 判断wwn是数组还是哈希引用 if (ref $wwn_container eq 'ARRAY') { # 多个WWN的情况,遍历数组取出每个$t foreach my $wwn_entry (@$wwn_container) { print Dumper $wwn_entry->{'$t'}; } } elsif (ref $wwn_container eq 'HASH') { # 单个WWN的情况,直接取$t print Dumper $wwn_container->{'$t'}; } } else { print Dumper "not defined"; } }
另外提个小细节:你原来代码里@{$PORTS[$PORT]->{'neighbor'}->{'wwn'}->{$t}}这里的$t没有加单引号,应该写成'$t',不过这不是导致你这次报错的主要原因,主要还是数据结构判断的问题。
这类问题在XML转JSON时很常见——XML里重复的子节点会被转成数组,单个子节点则是哈希,所以处理这类数据时一定要先判断引用类型,再做后续操作。
备注:内容来源于stack exchange,提问作者Denis.A
相关产品推荐
相关产品推荐

