LoginSignup
0
0

More than 5 years have passed since last update.

Perlハッシュの同列同keyのvalueを合算させる

Posted at

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
          ...
        ];

謎の数字で返ってきました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0