Snippets

sironekotoro Perl入学式 2018 第4回 復習問題 food.pl

Created by sironekotoro
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

# Perl入学式 2018 第4回 復習問題
# https://github.com/perl-entrance-org/workshop-2018/blob/master/4th/practice.md
# 復習問題(food.pl)

my $data = q{
    papix : sushi
    moznion : soba
    boolfool : sushi
    macopy : sushi
};

# food.pl では, 上記のように, $data に人物名と好きな食べ物を (スペース):(スペース) 区切りで与えています.
# この変数から食べ物が何回出現したかカウントして表示させてください.
# はじめに $data を改行ごとに split するとよいでしょう
# 分割後, 正規表現により必要な文字列を抽出してください


# 食べ物の名前と出現回数を入れるハッシュを用意する
my %food_hash = ();

# 素直に改行コードでsplitする
# splitした結果を配列 @name_food に格納
my @name_food = split /\n/, $data;

# 配列の中身をfor文で処理
for my $line (@name_food) {

    # 今回の問題文で求めるのは食べ物の出現回数なので、
    # 名前の部分に関しては「後方参照しない」正規表現、
    # 食べ物に関しては「後方参照する」普通の正規表現
    # を用いる
    $line =~ /(?:\w+) : (\w+)/;

    # 正規表現で$1が取得できなかった行(空行など)を
    # 無視するためにif文を利用
    if ($1) {

        # ハッシュfoodのkeyに食べ物、valueに+1する
        $food_hash{$1}++;
    }
}

# 食べ物の出現回数順にソートして表示する
for my $food ( sort { $food_hash{$b} <=> $food_hash{$a} } keys %food_hash ) {
    print "$food : $food_hash{$food}\n";
}

Comments (0)