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

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

Perl入学式 perl

いよいよ同シリーズ問題の最後、5問目です。ここまでの流れは前回の記事からご参照ください。

前回→Click!

今回のお題はこちら!
workshop-2013-03/practice.md at master · perl-entrance-org/workshop-2013-03 · GitHub

Perl入学式 #3 復習問題 - 5

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

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

JSON風Dumper

[
  {
    "python":10
    "binary":0
    "name":boolfool
    "ruby":20
    "perl":40
    "php":0
    "affiliation":namba.pm
    "sum":70
  }
  {
    "python":50
    "binary":0
    "name":papix
    "ruby":50
    "perl":60
    "php":0
    "affiliation":namba.pm
    "sum":160
  }
]
  • どんな方法でもよいので上記のような JSON 風 Dumper を作成して下さい

んで、いきなりですが最初に作った回答はこちら。

続けて、その1ヶ月後ぐらいに作った最近版の回答はこちら。

実行結果は、いずれもこんな風な。

[
  {
    "php":80
    "perl":60
    "python":50
    "binary":30
    "name":papix
    "ruby":50
    "affiliation":namba.pm
  }
  {
    "php":30
    "perl":40
    "python":10
    "binary":10
    "name":boolfool
    "ruby":20
    "affiliation":namba.pm
  }
  {
    "php":50
    "perl":100
    "python":70
    "binary":50
    "name":moznion
    "ruby":80
    "affiliation":hachioji.pm
  }
  {
    "php":100
    "perl":10
    "python":11
    "binary":100
    "name":binarian
    "ruby":1
    "affiliation":hachioji.pm
  }
  {
    "php":4
    "perl":1
    "python":0.01
    "binary":0.01
    "name":uzulla
    "ruby":0.5
    "affiliation":hachioji.pm
  }
]

はい。まあ実行結果のほうは、一応設問にあったままでしょうかね。というかそれに合うまでやったので当然ですが・・

肝心の回答の方なんですが、ん〜・・これもしかすると最初の方がいいかも? 2度めの方ではシングルクォートでダブルクォートを囲ったりドットで繋げたりしていますが、1度めはエスケープで処理してて見た目にもわかりやすいし・・
まあ、インデントの入れ方とかは2度めの方がシンプルかなって気もしますが・・

というかこの2度目の時、なぜか、というか「$people->{$key}」とかがダブルクォーテーションの中では展開されないような思い込みを持っていた気がするな・・それでわざわざドットでつなげていたような。

これを今さらに書きなおすとしたら、たとえばこんな感じか?
#関係あるとこだけ。

my @people = ($papix, $boolfool, $moznion, $binarian, $uzulla);
print "[\n";
for my $people (@people) {
    print "  {\n";
    for my $key (keys $people) {
        print "    \"$key\":$people->{$key}\n";
    }
    print "  }\n";
}
print "]\n";

はい。まあ、ともあれ、「score.pl」についてはこんな感じで全5問、2度ずつチャレンジしてみました。
昨日も書いたように、もう一個の「ranking.pl」については一回やってみたものの玉砕というか、いまだに全然わかってないので、次はそれに行ってみようかと思っています。

その後に、第4回や第5回の練習問題・復習問題等に入って、その中でいろいろハマった点のメモとか、あるいは今自分用にやってる作業の話とかできたらいいかなと思い中です。