少し前の復習問題。
https://github.com/perl-entrance-org/workshop-2013-03/blob/master/practice.md#votepl
papixさんによる解答例はこちら。
http://hachiojipm.github.io/entry/2013-09-09-02.html
なんだけど、最後の最後の方でたぶん記述間違いがあるのでそこ補正して実行してみた。
#!/usr/bin/env perl use strict; use warnings; my $papix = { name => 'papix', favorite_foods => [qw/ sushi niku ramen onigiri /], }; my $macopy = { name => 'macopy', favorite_foods => [qw/ sushi niku /], }; my $moznion = { name => 'moznion', favorite_foods => [qw/ sushi ramen /], }; my @people = ($papix, $macopy, $moznion); my %ranking; my $ranking = \%ranking; #「my $ranking = \%ranking;」がないと怒られるっぽい # やり直してみたらここは無くても大丈夫だった。でも後の「$votes」は無いと駄目と言われる。なんでや。 for my $person (@people) { my $favorite_foods = $person->{favorite_foods}; for my $food (@$favorite_foods) { $ranking{$food}++; } } my %votes; my $votes = \%votes; #「my $votes = \%votes;」がないと怒られるっぽい for my $food (keys %ranking) { push @{$votes{$ranking{$food}}}, $food; } for my $vote (sort { $b <=> $a } keys %votes) { print "$vote:\n"; for my $food (@{$votes->{$vote}}) { #「$sort」じゃなくて「$votes」っぽい print " $food\n"; } }
実行結果:
$ perl vote.pl 3: sushi 2: ramen niku 1: onigiri
ok!!
なんですが、実際には真ん中の
for my $food (@$favorite_foods) { $ranking{$food}++; }
から先、分かってないですね・・「$ranking{$food}++;」でもうキャパオーバー。
たぶんその前提になってる話とかが分かってない。
その次の問題の「score.pl」もかなり歯ごたえがあって、もっと分かってない。それについては別記事で追って・・