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
相关产品推荐
相关产品推荐

