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

