本文へスキップ
BecomeCoder

Perlコース · 第5章 ハッシュ · レッスン18

ハッシュで数える ― 出現回数を集計する

ブラウザで完結

導入

ハッシュの真価が出るのが「数える」処理です。「どの単語が何回出たか」のような集計が、数行で書けてしまいます。

説明

キーごとにカウンタを増やすのが定石です。$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"; }

実際に動かしてみよう

下のエディタにPerlを書いて「実行」を押すと、学習用シミュレータが print / say の出力を表示します(本物のperlではなく、教材の範囲を再現した軽量なエンジンです)。スカラ/配列/ハッシュ・制御構文・サブルーチン・正規表現(=~ / s///)なども動きます。本文の例を書き換えて動かしてみましょう(ファイル入出力・リファレンス・CPANモジュールなど一部の機能は対象外です)。

Perl — ブラウザ内で実行(学習用シミュレータ)

Perlの教材サブセットを動かす学習用シミュレータを読み込みます(本物のperlではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。