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

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

perl Perl入学式

きのうに続き、今となっては2回前のPerl入学式の復習問題に関するお話。

きのうの記事はこちらです。
Perl入学式in東京第3回復習問題score.pl(再チャレンジ編) - draft

本当は早くMojoliciousの話とか書きたいですけど、まあ順番に・・

今回の問題文はこちらです。
workshop-2013-03/practice.md at master · perl-entrance-org/workshop-2013-03 · GitHub

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

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

2. 言語毎の平均

  • 新たに$averageといったハッシュリファレンスに各々の人物の名前を key として、 perlrubypythonの平均値を格納してください
  • 出力には Data::Dumper などを使って表示させてください

はい。で、前にチャレンジしたときはこんな回答でした。
#例によって関係のあるところのみ書きます。
#全文はこちら→Click!

#!/usr/bin/env perl

use strict;
use warnings;
use DDP;

(略)

my $people;
my $average;

$people = $papix;
my $num1 = (($people->{perl} +$people->{python} +$people->{ruby}) / 3);
$people = $boolfool;
my $num2 = (($people->{perl} +$people->{python} +$people->{ruby}) / 3);
$people = $moznion;
my $num3 = (($people->{perl} +$people->{python} +$people->{ruby}) / 3);

$average = {
    papix => $num1,
    boolfool => $num2,
    moznion => $num3,
};
p $average;

実行結果はこんな。

\ {
    boolfool   23.3333333333333,
    moznion    83.3333333333333,
    papix      53.3333333333333
}

はい。で、つい最近チャレンジした2度めの回答はこんなでした。
#全文はこちら!→Click!

(同上)

my $average;
my @people = ($papix, $boolfool, $moznion, $binarian, $uzulla);
my @lang3 = qw/ perl python ruby /;

for my $people (@people) {
    my $sum = 0;
    for my $lang3 (@lang3) {
        $sum += $people->{$lang3};
        my $result = $sum / 3;
        my $key = $people->{name};
        $average->{$key} = $result;
    }
}
p $average;

実行結果はこんな。

\ {
    binarian   7.33333333333333,
    boolfool   23.3333333333333,
    moznion    83.3333333333333,
    papix      53.3333333333333,
    uzulla     0.503333333333333
}

大丈夫っぽいですかね・・というか、ちょっと余裕が出たのか、やってる時は気づかなかったですけど、最初のトライのときには3人分しかやってなかったのが、2度めには一応全員分に対象を広げて頑張ってますね。

肝心の内容についてですが、これは前問の「sum」に比べると結構1回目と2回目の回答の仕方が違います。
というか、先述のように、やってる時は前のと比べてないんで分かってませんでしたが、1stトライのときにはそれぞれの人に対して

$people = $papix;
my $num1 = (($people->{perl} +$people->{python} +$people->{ruby}) / 3);

とか書いてますね・・でもねえ、他に浮かばなかったんですよね。んで、今回はさすがに「それはまずい」と思ったようです。
とはいえ、まあこの第2作がどれだけ適切なのかは分からないわけですが・・

あと、実際には2回目のトライ時にはData::Dumperを使っていたのですが、1stトライのときにDDPというのを使ってみていたので上記ではそれに揃えてみました。
こうしてみるとこっちの方が見やすいのかな・・でも何となく内容によってはData::Dumperの方が見やすい気がして最近はそうしていたのですが。

しかしこういう風にスクリプトの比較をするような内容の場合、とくに行番号がわかった方がいいっすね・・Gistに上げて添付し直そうかな・・ちょっと考えてみます。

次回は同シリーズの3問目、「五段階評価」を扱う予定です。
workshop-2013-03/practice.md at master · perl-entrance-org/workshop-2013-03 · GitHub

はあ、とりあえず連日更新達成しました。そして今回もHateblo.vimのお世話になりました。ありがとうございました。> moznionさん&boolfoolさん