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

Perl解码JSON后提取指定值报错:Not a HASH reference

解决Perl解码JSON时的"Not a HASH reference"错误

核心错误原因

你的JSON字符串外层是数组[],decode_json解析后返回的是数组引用,不是哈希引用。直接用$Json->{front}会尝试把数组引用当作哈希引用访问,触发"Not a HASH reference"错误。需要先取数组中的第一个元素(因为数组里只有一个对象),再访问哈希字段。

其他代码问题修正

除了核心错误,代码还有几处语法问题:

  • use语句末尾缺失分号,且MIME:Base64应该是MIME::Base64(双冒号)
  • saveFile函数的参数列表缺失逗号:my ($file $image) → my ($file, $image)
  • 变量imageFile未声明为私有变量(缺失$符号)
  • 文件操作推荐使用三参数open写法,更安全且符合现代Perl规范
  • 脚本中不需要return语句,直接执行逻辑即可

修正后的完整代码

use strict;
use warnings;
use JSON;
use Data::Dumper;
use MIME::Base64;

my $imageDir = "/usr/documents/images/";

# 示例JSON,实际场景front/back应填充有效的base64字符串
my $testJson = '[{ "front":"", "back":"", "shortID":"", "longID":"" } ]';

my $json_data = decode_json($testJson);

# 取数组第一个元素(哈希引用)
my $item = $json_data->[0];

# 处理front图片(空串decode_base64返回空,实际需替换为有效base64)
my $fImage = decode_base64($item->{front});
my $fImagefile = saveFile('Front.jpg', $fImage);

# 处理back图片
my $bImage = decode_base64($item->{back});
my $bImagefile = saveFile('Back.jpg', $bImage);

print "图片已保存:$fImagefile, $bImagefile\n";

sub saveFile {
    my ($file, $image) = @_;
    my $imageFile = $imageDir . $file;

    # 三参数open写法,带错误信息
    open my $img_fh, '>', $imageFile or die "无法创建文件 $imageFile: $!";
    print $img_fh $image;
    close $img_fh;

    return $imageFile;
}

关键说明

  • 当JSON结构是数组时,必须通过数组索引(如->[0])获取内部的哈希对象
  • 确保front和back字段存储的是有效的Base64编码字符串,否则decode_base64会返回空或错误数据
  • 使用strict和warnings能提前发现大部分语法和变量问题,务必保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:06:52