Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
2 contributors

Users who have contributed to this file

@sironekotoro @xtetsuji
206 lines (147 sloc) 6.84 KB

Perl入学式 #4 復習問題

  • 解答例はansewr/フォルダにサポーターごとに格納してあります。

  • Perlのモットーは TMTOWTDI(やり方はいっぱいある)、同じ問題で同じ答えなのに様々な書き方ができます。

1. vote.pl

1-1. リファレンスの作成

  1. 自分の名前nameと、好きな食べ物favorite_foodsをkeyに持つハッシュリファレンスを作成してください。このとき、好きな食べ物のvalueは配列のリファレンスにしてください。

  2. 同様のハッシュリファレンスを2, 3個作ってみましょう。(例が思い浮かばなければ、周りの人のリアルデータを使ってみましょう)

1-2. リファレンスを配列に格納

1-1で作成した複数のハッシュリファレンスを、1つの配列に格納し、表示してみましょう。

ヒント

  • 複数のリファレンスを配列に収めるためには、たとえばこのようにします。
my @array = ($ref1, $ref2, $ref3);
  • すでにサブルーチン(関数)を学んだ後であれば、配列を操作する関数を使っても良いでしょう。

1-3. ランキングの表示

どのような方法でも良いので、好きな食べ物のランキングを作って、表示してみてください。

ヒント

複数のハッシュリファレンスを格納した配列を for でひと通り回して (各ハッシュリファレンスにアクセスし)、配列リファレンスfavorite_foodsの中身を別の配列にひと通り格納して……という方法が1つ考えられますね!

2. score_**.pl

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

このハッシュリファレンスには、人物の名前(name), 国(country), プログラミング言語のスコア(perl, python, ruby, php, binary)が格納されています。

なお、それぞれのハッシュリファレンスには, 必ずname, country, perl, python, ruby, php, binaryのキーが含まれています。

my $alice = {
    name        => 'Alice',
    country     => 'England',
    perl        => 60,
    python      => 80,
    ruby        => 80,
    php         => 50,
    binary      => 30,
};

2-1. 点数の合計(score_sum.pl)

score.pl をコピーして、以下の問題を解いてください。

それぞれの人物を表したハッシュリファレンスに、そのハッシュリファレンスに含まれるプログラミング言語のスコア(perl, python, ruby, php, binary)を合計した値を sum というキーで追加してみましょう。

ここでは, 手動でスコアを合計してハッシュリファレンスに直接入力するのではなく、 ハッシュリファレンスを利用してスコアの合計値を計算してから入力するようにしましょう。

ヒント

例えば、 $alice に含まれる perlruby のスコアの合計であれば、次のようなコードで計算できるでしょう。

my $sum = $alice->{perl} + $alice->{ruby};

このようにしてすべてのプログラミング言語のスコアを合計して、 $alicesum というキーで代入すればよさそうですね!

とはいえ、すべてのハッシュリファレンスに対してこの処理を繰り返すのは冗長なので、 @people@languages といった変数を作り、そこに各ハッシュリファレンスや言語名を格納してみましょう。

出力例

例えば、 $alice のハッシュリファレンスに含まれるプログラミング言語のスコアの合計値は 300 なので、以下のようになります。(ただし、表示したときに key の順番がこの通りになるとは限りません)

my $alice = {
    name        => 'Alice',
    country     => 'England',
    perl        => 60,
    python      => 80,
    ruby        => 80,
    php         => 50,
    binary      => 30,
    sum         => 300,
};

2-2. 言語ごとの平均(score_avg.pl)

score.pl をコピーして、以下の問題を解いてください。

$average というハッシュリファレンスを新しく作ります。 このハッシュリファレンスに、各人物の perl, ruby, pythonの3つのプログラミング言語のスコアの平均値を格納してください。

ヒント

  • ハッシュリファレンスのkeyには各人物の名前を使いましょう。
  • 出力には Data::Dumper を使いましょう。

出力例

ハッシュリファレンスなので順不同となります。

$VAR1 = {
          'Carol' => '83.3333333333333',
          'Dave' => '24',
          'Bob' => '23.3333333333333',
          'Ellen' => '5.5',
          'Alice' => '73.3333333333333'
        };

2-3. 五段階評価(score_star.pl)

下記を参考に、各人物の言語ごとの成績を5段階で出力して下さい。

 0 - 19 =>
20 - 39 => *
40 - 59 => **
60 - 79 => ***
80 - 99 => ****
100     => *****

出力例

Bob
  perl : ***
  python : ***
  ruby : ***
  php : ***
  binary : ***

文字を揃えたい場合には、 printfsprintf を調べてチャレンジしてみましょう。

bob
  perl   : **
  python :
  ruby   : *
  php    : *
  binary : **

2-4. 国ごとのPerlハイスコアリストを作る(score_country.pl)

$highscoreというハッシュリファレンスを作成し、国(country)ごとの perl のスコアが 60 以上の人の名前を格納しましょう。

ヒント

ハッシュリファレンスのkeyにはcountryを利用し、valueには配列のリファレンスを格納すると良いでしょう。

出力例

ハッシュリファレンスなので、国名は順不同となります。

$VAR1 = {
          'Canada' => [
                        'Dave'
                      ],
          'England' => [
                         'Alice',
                         'Carol'
                       ]
        };

2-5. JSON風Dumper(score_jsonize.pl)

どのような方法でもよいので、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"
  }
]
You can’t perform that action at this time.