Snippets

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

Created by sironekotoro
#!/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

Comments (0)