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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:57:56