Snippets

sironekotoro Perl入学式 2018 第3回 復習問題 vote.pl

Created by sironekotoro

File vote.pl Added

  • Ignore whitespace
  • Hide word diff
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Data::Dumper;
+
+# Perl入学式 2018 第3回 復習問題 vote.pl
+# https://github.com/perl-entrance-org/workshop-2018/blob/master/3rd/practice.md
+
+# 1-1 リファレンスの作成
+
+# 1.自分の名前nameと、好きな食べ物favorite_foodsをkeyに持つハッシュリファレンスを作成してください。このとき、好きな食べ物のvalueは配列のリファレンスにしてください。
+
+# ハッシュリファレンスのvalueに、好きな食べ物を無名配列で入れる
+my $hash_ref_myself = {
+    name           => 'sironekotoro',
+    favorite_foods => [ 'pudding', 'chocolate', ],
+};
+
+# 確認用Data::Dumper
+# print Dumper $hash_ref_myself;
+
+
+# 2.同様のハッシュリファレンスを2, 3個作ってみましょう。(例が思い浮かばなければ、周りの人のリアルデータを使ってみましょう)
+
+
+# https://ja.wikipedia.org/wiki/ジョルノ・ジョバァーナ
+
+# 1.@favorite_food という配列を作成
+my @favorite_food_array = ( 'chocolate', 'pudding', 'salad' );
+
+# 2.@favorite_food をリファレンス化して、
+#   スカラー favorite_food_array_ref に代入
+my $favorite_food_array_ref = \@favorite_food_array;
+
+# 3.$array_ref をハッシュリファレンス $hash_ref_comic の
+#   キー favolite_food に対する valueとして格納
+my $hash_ref_comic = {
+    name           => 'Giorno Giovanna',
+    favorite_foods => $favorite_food_array_ref,
+};
+
+# 確認用Data::Dumper
+# print Dumper $hash_ref_comic;
+
+
+# https://ja.wikipedia.org/wiki/リラックマ
+
+# 1.ハッシュを作成
+my %hash_sanrio = (
+    name           => 'Rilakkuma',
+    favorite_foods => [ 'dango', 'hotcake', 'omerice', 'pudding' ],
+);
+
+# 2.ハッシュをハッシュリファレンスにする
+my $hash_ref_sanrio = \%hash_sanrio;
+
+# 確認用Data::Dumper
+# print Dumper $hash_ref_sanrio;
+
+
+
+# 1-2 リファレンスを配列に格納
+# 1-1で作成した複数のハッシュリファレンスを、1つの配列に格納しましょう。
+
+# 配列の要素として直接記述する書き方
+my @array_direct = ( $hash_ref_myself, $hash_ref_comic, $hash_ref_sanrio );
+
+# または配列操作の関数 push を使う書き方
+my @array_push = ();
+push @array_push, $hash_ref_myself;
+push @array_push, $hash_ref_comic;
+push @array_push, $hash_ref_sanrio;
+
+# あるいは配列操作の関数 unshift を使う書き方
+my @array_unshift = ();
+unshift @array_unshift, $hash_ref_sanrio;
+unshift @array_unshift, $hash_ref_comic;
+unshift @array_unshift, $hash_ref_myself;
+
+
+
+# 1-3. ランキングの表示
+# どのような方法でも良いので、好きな食べ物のランキングを作って、表示してみてください。
+
+# 食べ物の出現回数を数える用ハッシュ
+my %hash = ();
+
+# for文で配列 @array_direct の各要素(ハッシュリファレンス)にアクセスする
+for my $hash_ref (@array_direct) {
+
+    # ハッシュリファレンス内のkey "favorite_foods"のvalueを
+    # デリファレンスして、配列に戻す
+    my @favorite = @{ $hash_ref->{favorite_foods} };
+
+    # for文で配列 @favorite から要素(食べ物)を取り出し、
+    # ハッシュのkeyに設定、valueはインクリメント演算子で
+    # +1 する
+    for my $food (@favorite) {
+        $hash{$food}++;
+    }
+}
+
+# sort文でハッシュの値(食べ物の出現回数)で降順ソートし、
+# 配列 @ranking に格納する
+my @ranking = sort { $hash{$b} <=> $hash{$a} } keys %hash;
+
+# for文で配列 @ranking から要素を取り出し、
+# ハッシュのkeyに設定して出現回数と要素名(好きな食べ物名)を
+# 表示する
+for my $food (@ranking) {
+    print $hash{$food}, ':', $food, "\n";
+}
+
+# 3:pudding
+# 2:chocolate
+# 1:omerice
+# 1:hotcake
+# 1:salad
+# 1:dango
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.