Permalink
Find file
175 lines (123 sloc) 5.52 KB

Perl入学式 #3 復習問題

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. 点数の合計

それぞれの人物を表したハッシュリファレンスに, そのハッシュリファレンスに含まれるプログラミング言語のスコア(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. 言語ごとの平均

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

ヒント

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

出力例

$VAR1 = {
          'alice' => ??,
          'bob' => ??,
          ...
        };

2-3. 五段階評価

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

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

出力例

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

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

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

ヒント

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

出力例

England: Alice
Canada: ???

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
    "affiliation":"America"
  }
]