導入
ハッシュの真価が出るのが「数える」処理です。「どの単語が何回出たか」のような集計が、数行で書けてしまいます。
説明
キーごとにカウンタを増やすのが定石です。$count{$word}++ と書くと、そのキーがまだ無くても 0 から始まって 1 になります(自動で作られます)。
use strict;
use warnings;
my @words = ("apple", "banana", "apple", "cherry", "banana", "apple");
my %count;
foreach my $w (@words) {
$count{$w}++;
}
foreach my $w (sort keys %count) {
print "$w: $count{$w}\n";
}
# apple: 3 / banana: 2 / cherry: 1
split で文章を単語に分けてから数えれば、簡単な単語カウンタになります。
use strict;
use warnings;
my $text = "to be or not to be";
my %freq;
$freq{$_}++ for split / /, $text;
foreach my $w (sort keys %freq) {
print "$w => $freq{$w}\n";
}
やってみよう
@words の中身を変えて、集計結果が変わることを確かめましょう。$text の文章を変えて単語カウンタも試してください。
演習
配列 @votes = ("A", "B", "A", "A", "C", "B"); の各要素の出現回数をハッシュ %tally で数え、sort keys の順に 候補=票数(例 A=3)で表示してください。
ヒント1を見る
my %tally; $tally{$_}++ for @votes; のあと foreach my $k (sort keys %tally) { print "$k=$tally{$k}\n"; }。