ハッシュを結合する

単語頻度を扱うと,ハッシュを結合したくなる.いちいち自己流ロジックを書いていたけれど,何か良い方法はないものか.図書館から借りてきたPerlクックブックを開いてみた.

my %new_hash = (%hash1, %hash2);

# これは,以下のようなハッシュの初期化ができることから納得できる
# my %hash = (hoge => 1, bar => 2, piyo =>3);
# my %hash = (hoge, 1, bar, 2, piyo, 3);

あれ,もしかして?

my %hash = ('hoge', 1, 'bar', 2, 'piyo', 3);
foreach my $keyorvalue (%hash){
  print $keyorvalue . "\n"
}

出力結果:
bar
3
foo
2
hoge
1

そういうことか!ハッシュはつまり,key, valueのリストとしても扱える発見.これは,かなり便利な使い方ができそうだ.

横道にそれてしまったが,この記法は便利だけれど,重複したキーがあると上書きされてしまうという問題がある.valueが数値の場合は,気にせず
>|perl
foreach my $key (keys %hash2){
$hash1{$key} += $hash2{$key};
}
|