kwsktr's study log

kwsktr のおべんきょログ

Perl の配列とハッシュのテクニック (2)

いろいろと順番が前後している気もするけれど気にしない。
もう少しだけPerlの配列/ハッシュ絡みの覚書。

ハッシュの値だけを合計

my %score = (
    "Homer" => 234, "Marge" => 135,
    "Bart" => 87, "Lisa" => 58,
    "Burns" => 5, "Krusty" => 135,
);

my $totalscore;

while (my ($key, $val) = each %score) {
    $totalscore += $score{$key};
}

print $totalscore;  # 654
同じことを別のやり方で

ハッシュから値だけを取得して計算してしまえば一緒じゃないかな。
values 関数で値をリストで取得して合計しちゃう。

foreach my $val (values %score) {
    $totalscore += $val;
}

print $totalscore;  # 654

keys 関数は、キーをリストで取得。

ハッシュの値でソート
my @words = qw ( D'oh! Aye_carumba Aye_carumba D'oh! Aye_carumba D'oh! D'oh! D'oh! );

# %phrase に集計
my %phrase;
foreach my $element (@words) {
    $phrase{$element}++;
}

# 値でソートして出力
foreach my $val (sort { $phrase{$a} <=> $phrase{$b} } keys %phrase){
    print "$val -> $phrase{$val}\n";
}

# Aye_carumba -> 3
# D'oh! -> 5

複数のキーでソート

自分で書こうと思ったけど『初めてのPerl 第5版』をカンニング。


my %score = (
    "Homer" => 234, "Marge" => 135,
    "Bart" => 87, "Lisa" => 58,
    "Burns" => 5, "Krusty" => 135,
);

my @winners = sort {$score{$b} <=> $score{$a} || $a cmp $b} keys %score;

foreach my $name (@winners) {
    print $name, "\n";
}

ポイントはsort関数で予約されている $a $b の使い方。
sort関数はリストの要素(ここではkeys %score)を$a と $bに代入して、比較を行なっている。


どうでもいいことだけど、シンプソンズにしてみた。
フリントストーンって日本じゃマイナーなんだもん……えっ!シンプソンズも?

ザ・シンプソンズ MOVIE (劇場版) [DVD] フリントストーン/モダン石器時代 【ベスト・ライブラリー 1500円:コメディ映画特集】 [DVD]