Snippets

sironekotoro Perl入学式 2018 第3回 復習問題 score.pl 2-5

Created by sironekotoro
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

# Perl入学式 2018 第3回 復習問題 score.pl
# https://github.com/perl-entrance-org/workshop-2018/blob/master/3rd/practice.md

# 2-5. JSON風Dumper
# どのような方法でもよいので、score.plで用意されたデータを, 次のようなフォーマットで出力するようにしてみてください。
# 出力例

# [
#   {
#     "python":80
#     "binary":30
#     "name":"Alice"
#     "ruby":80
#     "perl":60
#     "php":50
#     "country":"England"
#   },
#   {
#     "python":10
#     "binary":50
#     "name":"Bob"
#     "ruby":50
#     "perl":40
#     "php":30
#     "country":"America"
#   }
# ]

my $alice = {
    name    => 'Alice',
    country => 'England',
    perl    => 60,
    python  => 80,
    ruby    => 80,
    php     => 50,
    binary  => 30,
};
my $bob = {
    name    => 'Bob',
    country => 'America',
    perl    => 40,
    python  => 10,
    ruby    => 20,
    php     => 30,
    binary  => 50,
};
my $carol = {
    name    => 'Carol',
    country => 'England',
    perl    => 100,
    python  => 70,
    ruby    => 80,
    php     => 50,
    binary  => 50,
};
my $dave = {
    name    => 'Dave',
    country => 'Canada',
    perl    => 60,
    python  => 11,
    ruby    => 1,
    php     => 100,
    binary  => 100,
};
my $ellen = {
    name    => 'Ellen',
    country => 'America',
    perl    => 1,
    python  => 15,
    ruby    => 0.5,
    php     => 60,
    binary  => 0.01,
};

# 出力例をみると、ハッシュリファレンス?と見せかけて
# keyの出現順は固定っぽい。
# keyの文字数の降順でもなく、ABC順でもない。
# name,country,各言語が key,value のように並んでいるが、
# 各ペアの末尾にカンマがない
#
# いやらしいことに、配列リファレンス最後の要素後にはカンマがない・・・
#
# 単純に JSON::PP で解決って方法は取れないと判断
#
# Alice の次に Bob が来ているから、配列の並び順はnameのABC順で良さそう

# それぞれの人物を表したハッシュリファレンスを集めた配列を作成
my @people = ( $alice, $bob, $carol, $dave, $ellen );

# 処理する配列リファレンスの要素数を取得する
# 何回ハッシュリファレンスを処理(表示)したかを
# 保存しておくカウンタ
my $count = 0;

# 配列リファレンスを扱うfor文の上下を [ ] で挟む
print '[', "\n";

# for文でハッシュリファレンスの入った配列要素に順番にアクセスする
for my $man (@people) {

    # keyというか、keyもどき?の配列を作る
    my @key = qw(python binary name ruby perl php country);

    # ハッシュリファレンス風の中かっこをつける
    print '  {', "\n";

    # for文で配列 @key から順次取り出す
    for my $key (@key) {

     # ただし、name と country については value が文字列で
     # ダブルクォーテーションで囲んであるので if文で分ける

        if ( $key eq 'name' || $key eq 'country' ) {

            print "    \"$key\":", "\"$man->{$key}\"", "\n";
        }
        else {
            print "    \"$key\":", $man->{$key}, "\n";

        }

    }
    # ハッシュリファレンスを表示し終わったらカウンタを1増やす
    $count++;

    # 最後のハッシュリファレンスを処理し終えたら、
    # カンマなしの中かっこを表示する
    if ($count == $#people + 1){
        print "  }\n"
    }else{
        print "  },\n";
    }
}

print ']' , "\n";

Comments (0)