ハッシュを結合する

単語頻度を扱うと,ハッシュを結合したくなる.いちいち自己流ロジックを書いていたけれど,何か良い方法はないものか.図書館から借りてきた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};
}
|

続きを読む

省メモリeach

今までハッシュのキーでループ回すときとか,省メモリにしたい場合は,いちいち

keys %hash;
while(my $key = shift @keys){
  # hogehoge
}

ということをやってきた.どうも汚いなぁ,と思っていたが,どうやらeachを使えばいいらしい.上記のプログラムと等価

while(my ($key, $value) = each %hash){
  # hogehoge
}

いずれにせよ,巨大なハッシュでループを使う場合は気をつけよう.