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版』をカンニング。
初めてのPerl 第5版
posted at 2011.4.9
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に代入して、比較を行なっている。
どうでもいいことだけど、シンプソンズにしてみた。
フリントストーンって日本じゃマイナーなんだもん……えっ!シンプソンズも?