sironekotoroの日記

Perl で楽をしたい

Perl入学式 #3 復習問題の続き2

ハッシュとハッシュリファレンスは違うんだよ

  • Perl入学式 #3 復習問題
  • これのしょっぱなのやつ、vote.plの4番で死にそうに。
    1. . 「自分の名前 (name)」と「好きな食べ物の配列のリファレンス (favorite_foods)」を持ったハッシュリファレンスを作成しましょう (つまり、好きな食べ物は複数個書いてください)
    2. . 同様のハッシュリファレンスを2, 3個作ってみましょう (周りの人のリアルデータを使ってハッシュrefを作ると良いかもしれません)
    3. . 作成した複数のハッシュリファレンスを1つの配列に格納しましょう (配列を操作する関数を使っても良いですし、直で代入しても良いです)
    4. . どんな方法でも良いので、好きな食べ物のランキングを作って表示してみて下さい <
  • 先週やった問題とはいえ、鳥頭なので何度でも楽しめます。
  • なので、先週とは違った解法に目覚めたりしてとても楽しいです。
  • 先週はwebとかからいろいろ使えそうなスクリプト引っ張ってきてなんとかしたけど、今回はちょっと考えてみようと。
    • その結果3時間試行錯誤が続くことに。
  • ソートのところはよくわからんので、応用問題出されたりしたら分からなそう。何となく分かるんだけど。
    • わかってない
use strict;
use warnings;
use Data::Dumper;

# 1. 「自分の名前 (name)」と「好きな食べ物の配列のリファレンス (favorite\_foods)」を
# 持ったハッシュリファレンスを作成しましょう
# 2. 同様のハッシュリファレンスを2, 3個作ってみましょう 

my $sironekotoro = {
    name           =>   "sironekotoro",
    favorite_food  =>   ['meat' ,'beef' ,'chikin']
};

my $softy = {
    name           =>   "softy",
    favorite_food  =>   ['karikari' , 'kankan' , 'fish' , 'meat']
};

my $siro = {
    name           =>   "siro",
    favorite_food  =>   ['kankan' , 'meat']
};


# 3. 作成した複数のハッシュリファレンスを1つの配列に格納しましょう 
my @array = ($sironekotoro , $softy , $siro);


# 4. どんな方法でも良いので、好きな食べ物のランキングを作って表示してみて下さい
my @foods;

for my $member(@array){
    for my $foo(@{$member->{favorite_food}}){
        push @foods , $foo;
    }
}

# ハッシュリファレンスのKeyに@foodの要素を代入していく。
# ハッシュはkeyの値は重複しないので一意になる。
# ハッシュのvalueは1ずつ増やすように=+1としておく。

my %hash;

for my $bar(@foods){
    $hash{$bar} += 1;
};


# ハッシュとハッシュレファレンスから値を呼び出す方法は違う
#  ハッシュの場合 $hash{key}
#  ハッシュリファレンスの場合 $hash->{key}
# ここで3時間くらいはまった
# ソートのところはよくわからん
for my $i(sort { $hash{$b} cmp $hash{$a} } keys %hash){
    print "$i : $hash{$i}\n";
};