You need to enable JavaScript to run this app. Perl从含多层嵌套哈希的_errlist_字段提取错误字符串的方案
优惠活动
大模型
产品
解决方案
定价
更多

Perl从含多层嵌套哈希的_errlist_字段提取错误字符串的方案

问题根因

你现有代码的核心问题是判断分支优先级完全错误:第二个判断分支elsif (defined($RunActSeq->[0]->{'_errlist_'}->[0]))会匹配所有_errlist_第一个元素存在的场景,哪怕该元素是哈希引用类型,此时你直接将哈希引用赋值给$errmsg,输出时自然就会显示HASH(内存地址)格式的内容,后面判断单层/多层message的分支永远不会被触发。

另外写死层级判断的方案兼容性极差,只要嵌套层数超过你写的3层就会再次出现引用输出的问题。

解决方案

写一个循环逐层拆解message嵌套,不管嵌套多少层都能自动提取到最内层的字符串:

# 先取到_errlist_的第一个元素
my $err_raw = $RunActSeq->[0]->{'_errlist_'}->[0];
my $errmsg = "Undefined Error";

if (defined $err_raw) {
    my $current_val = $err_raw;
    # 循环拆解message嵌套:只要当前值是哈希且存在message键就继续深入
    while (ref $current_val eq 'HASH' && exists $current_val->{message}) {
        $current_val = $current_val->{message};
    }
    
    # 判断最终拿到的值是不是普通字符串
    if (!ref $current_val) {
        $errmsg = $current_val;
    } else {
        # 可选兜底:如果最终还是引用类型,用Data::Dumper转成可读文本
        require Data::Dumper;
        $errmsg = Data::Dumper->new([$current_val])->Terse(1)->Dump();
    }
}

逻辑说明

  • 用ref函数判断变量类型,只要是哈希引用且存在message键就自动进入下一层取值,不需要手动写死判断层级
  • 最终如果拿到的是普通标量(字符串/数字)就直接作为错误信息,要是还是引用类型就用Data::Dumper序列化为可读文本,彻底避免输出内存地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 22:51:02