読者です 読者をやめる 読者になる 読者になる

Perl入学式復習:第3回の復習問題「vote.pl」より

少し前の復習問題。
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」もかなり歯ごたえがあって、もっと分かってない。それについては別記事で追って・・