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

Perl入学式in東京第3回復習問題score.pl(再チャレンジ編)

perl Perl入学式

先週の今頃に突発的な用件が発生したのと、その後にちょっと体調崩してブログには記録できなかったですが、Perlの自習自体はその後も毎日続いています。

いくつかネタは溜まっていますが、せっかくなので「もし書き続けてていたらこれ書くつもりだった」という話を順番にまた書いていきたいと思います。

Perl入学式が12/8に開催されて、もう第5回目ですかね、東京編。
それに行くために予習を重ねていたんですが(結局行けませんでしたが)、ええとメインはサブルーチンと正規表現かな。これ。
workshop-2013-04/slide.md at master · perl-entrance-org/workshop-2013-04 · GitHub

なんだけど、その前に11月いっぱいまともに勉強できていなかったので、リハビリの流れで、という感じでそれの前段階の、リファレンスとかそういう感じの復習問題をやっていました。
具体的にはこれです。
workshop-2013-03/practice.md at master · perl-entrance-org/workshop-2013-03 · GitHub

んで、これについてはすでに一回、通してやってみた解答をUPしたりしていたんですが、あらためてやったら結構結果が違ったので(そういえばまだ模範解答出てないな)、その辺のマイ検証作業をしていこうかなと。

さっそくですが、第一問はこんな内容です。

my $boolfool = {
    name        => 'boolfool',
    affiliation => 'namba.pm',
    perl        => 40,
    python      => 10,
    ruby        => 20,
    php         => 0,
    binary      => 0,
};

score.pl には上記のようなハッシュリファレンスがいくつか宣言してあります

1. 点数の合計

  • それぞれの人物のperlrubypython ... といった分野毎の合計値をそれぞれのリファレンスに追加しましょう
  • @people や @languages と言った変数に各々のリファレンスや言語などを格納しておくとやりやすいでしょう

はい。んで、前回のぼくの解答はこんなでした。
#長くなるので関係のある終盤のみ載せます。
#コード全体を見たい方は最後にファイルへのリンクを載せますので、そちらからどうぞ。

my @people = ($papix, $boolfool, $moznion, $binarian, $uzulla);
my @lang = qw(perl python ruby php binary);

for my $people (@people) {
    my $sum = 0;        
    for my $lang (@lang) {
        my $num = "$people->{$lang}\n";
        $sum = $sum + $num;
    }
    print "$people->{name}: $sum\n";
}

出力はこんな。

papix: 270
boolfool: 110
moznion: 350
binarian: 222
uzulla: 5.52

これの再チャレンジ版はこんな風になりました。

my @people = ($papix, $boolfool, $moznion,$binarian, $uzulla);
my @lang = qw/ perl python ruby php binary /;

for my $people (@people) {
    my $sum = 0;
    for my $lang (@lang) {
        $sum += $people->{$lang};
    }
    print "$people->{name}\t=>$sum\n";
}

出力はこんな。

papix	=>270
boolfool	=>110
moznion	=>350
binarian	=>222
uzulla	=>5.52

はい。なんか出力の書式が違っちゃってますけど、とくに指定もないのでいいでしょうかね。(わからないですが)
前の回答内容は見ないで作ったんですが、その割に前半はぴったり同じですね。変数の付け方まで、適当に書いた割に同じ。
後半で唯一、「+=」てのを使って1行だけ行数ダイエットしてますが、それだけの違いですね。

といっても、じつはこれ出すのにすんげー時間かかったな・・ようは「->」を使ったデリファレンスとか、基礎的なことに思い至るまでに時間がかかった、ということなんですが。

第2問以降についてはまた次回としますが、「score.pl」の一連の回答ファイルは初回版も再チャレンジ版もGitHubに上げています。
perl_entrance/2013_3/revise/2_score at master · note103/perl_entrance · GitHub