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

Perl如何将DBI查询结果转换为按年份分组的数组哈希结构

Perl转换DBI查询结果为按年份分组的数组哈希

最简洁的原生Perl实现不需要安装任何第三方模块,利用语言原生特性两行代码就能完成转换:

my $VAR2 = {};
push @{ $VAR2->{$_->{year}} }, $_->{agent_id} for @$agent_details;

执行完得到的结构和你给出的目标$VAR2完全一致。


实现原理

  • 依赖Perl原生的**自动生成(Autovivification)**特性:当你向一个不存在的哈希键对应的值执行数组类型的push操作时,Perl会自动把这个键对应的值初始化为空数组引用,完全不需要手动写exists判断、提前赋值空数组的冗余逻辑。
  • 你的原始SQL已经加了ORDER BY agent_id排序,所以push进每个年份数组的agent_id顺序天然和你期望的[1,4]/[2,5]/[3,6]顺序一致,不需要额外排序操作。

其他可选写法

如果你偏好函数式编程风格,可以用Perl核心自带的List::Util里的reduce实现,同样不需要安装依赖:

use List::Util qw(reduce);
my $VAR2 = reduce {
    push @{ $a->{$b->{year}} }, $b->{agent_id};
    $a
} {}, @$agent_details;

细节调整

如果你需要结果里的agent_id是数值类型而非数据库查询返回的字符串类型,只需要在push时做一下隐式数值转换即可:

push @{ $VAR2->{$_->{year}} }, 0 + $_->{agent_id} for @$agent_details;

另外你当前的查询取了type字段,但转换逻辑完全没用到,如果后续业务不需要这个字段,可以直接把SQL改成SELECT agent_id, year FROM agents ORDER BY agent_id,减少不必要的数据传输。

你之前写的冗余逻辑大概率是多了手动判断键是否存在、初始化空数组的步骤,这在Perl里是完全多余的。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:54:23