Javascriptとかだとlodashでいい感じにできるんですけど、Perlでやろうとしたら割と苦戦した。
やりたい事
lsitの同配列番号の同keyのvalueを合算させたい
dateだけそのまま
$list =
[
{
'ringo' => 10,
'banana' => 20,
'date' => "2018年10月1日"
},
{
'ringo' => 40,
'banana' => 50,
'date' => "2018年10月2日"
}
],
[
{
'ringo' => 100,
'banana' => 200,
'date' => "2018年10月1日"
},
{
'ringo' => 400,
'banana' => 500,
'date' => "2018年10月2日"
}
];
# 最終的にこうしたい
$result =
[
{
'ringo' => 110,
'banana' => 220,
'date' => "2018年10月1日"
},
{
'ringo' => 440,
'banana' => 550,
'date' => "2018年10月2日"
}
];
解決
空のリストを作っておき、ハッシュキーを1個1個指定してループ中で代入する
my $result =
[
{
'ringo' => 0,
'banana' => 0,
'date' => "2018年10月1日"
},
{
'ringo' => 0,
'banana' => 0,
'date' => "2018年10月2日"
}
];
for my $rows ( @$list ) {
for ( my $i = 0; $i < scalar( @$rows ); $i++ ) {
$result->[$i]->{ringo} += $rows->[$i]->{ringo};
$result->[$i]->{banana} += $rows->[$i]->{banana};
}
}
warn Dumper $result;
# 結果 ($result)
$VAR1 = [
{
'ringo' => 110,
'banana' => 220,
'date' => "2018年10月1日"
},
{
'ringo' => 440,
'banana' => 550,
'date' => "2018年10月2日"
}
];
dateまで足してしまうと、 "2018年10月1日2018年10月1日"
みたいになるので外しました
足したいvalueが文字列になっている場合、文字列結合してringoの例だと、10010みたいになるので気をつけてください
perlは型指定が無いので少し油断しちゃうとすぐ数字が文字列型になって困ります
キーを一つ一つ指定しなきゃダメなの?
ハッシュを丸ごと代入してみたパターン
for my $rows ( @$list ) {
for ( my $i = 0; $i < scalar( @$rows ); $i++ ) {
$result->[$i] += $rows->[$i];
}
}
warn Dumper $result;
# 結果 ($result)
$VAR1 = [
445320520,
445134824,
445244752
...
];
謎の数字で返ってきました