如何用map/grep单行语句汇总指定receipt_id的payment_id对应金额?
单行map/grep实现方案
要实现按payment_id分组,累加指定receipt_id(如'100')对应的payment_amount,可以借助临时哈希在do块内完成累加,单行代码如下:
my %sum_by_payment_id = do { my %temp; map { $temp{$_->{payment_id}} += $_->{payment_amount} } grep { $_->{receipt_id} eq '100' } @$payments; %temp };
代码说明:
grep { $_->{receipt_id} eq '100' } @$payments:先过滤出所有receipt_id为'100'的支付记录map { $temp{$_->{payment_id}} += $_->{payment_amount} } ...:遍历过滤后的记录,将每个payment_id对应的金额累加到临时哈希%temp中do {}块:创建局部作用域的临时哈希,避免污染外部变量空间,最后将临时哈希展开为键值对赋值给目标哈希%sum_by_payment_id
之前仅拿到最后一笔金额的原因是直接用map生成哈希时,相同payment_id的后续项会覆盖之前的值,而通过临时哈希累加就能解决这个问题。
内容的提问来源于stack exchange,提问作者ComputersAreNeat
相关产品推荐
相关产品推荐

