sironekotoroの日記

Perl で楽をしたい

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

やっと終わった。#3の練習問題で一番きつかったのはしょっぱなのvote.plだなぁ。来週なったらちゃんと書けるか心配。

次はPerl入学式 in Yapc::Asiaの復習。いや、後1回くらいはvote.plやっとこう。

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;
# binmode STDOUT, ":utf8";

my $papix = {
    name => 'papix',
    affiliation => 'namba.pm',
    perl => 60,
    python => 50,
    ruby => 50,
    php => 80,
    binary => 30,
};
my $boolfool = {
    name => 'boolfool',
    affiliation => 'namba.pm',
    perl => 40,
    python => 10,
    ruby => 20,
    php => 30,
    binary => 10,
};
my $moznion = {
    name => 'moznion',
    affiliation => 'hachioji.pm',
    perl => 100,
    python => 70,
    ruby => 80,
    php => 50,
    binary => 50,
};
my $binarian = {
    name => 'binarian',
    affiliation => 'hachioji.pm',
    perl => 10,
    python => 11,
    ruby => 1,
    php => 100,
    binary => 100,
};
my $uzulla = {
    name => 'uzulla',
    affiliation => 'hachioji.pm',
    perl => 1,
    python => 0.01,
    ruby => 0.5,
    php => 4,
    binary => 0.01,
};


# 1.点数の合計
my $sum;
my @people = ($papix , $boolfool , $moznion , $binarian , $uzulla);
my @language = qw(perl python ruby php binary);


for my $member(@people){
    for my $i(@language){
#        print "$member->{$i}\n";
        $sum += "$member->{$i}";
    }
#    print "$member->{name} : $sum\n";
    $member->{sum} = $sum;
    $sum = 0;
}


# 2.言語ごとの平均
my $avarage;

for my $member(@people){
#    print $member->{name};
    my $prp = ($member->{perl} + $member->{ruby} + $member->{python}) / 3;
#    print $prp;
    $avarage->{$member->{name}}=$prp;
    $prp = 0;
}

#print Dumper $avarage;


# 3.五段階評価
for my $member(@people){
    print "$member->{name}\n";
    for my $i(@language){
        print " $i : $member->{$i} ";
        if ($member->{$i} < 20){
            print "\n";
        }elsif($member->{$i} < 40){
            print "★\n";   
        }elsif($member->{$i} < 60){
            print "★★\n";
        }elsif($member->{$i} < 80){
            print "★★★\n";
        }elsif($member->{$i} <= 99){
            print "★★★★\n";
        }elsif($member->{$i} == 100){
            print "★★★★★\n";
        }
    }
}

# 4.所属毎のperlのスコアが60以上の人の名前を格納する
# $highscore と言ったハッシュリファレンスを用意し、所属毎に優秀な人物の名前を push して下さい
my $highscore;

# pushを使うということは、配列として扱う必要があるので、配列のデリファレンスにpushする
for my $member(@people){
    if ($member->{perl} >= 60){
#        print "$member->{name} : $member->{perl}\n"
        push @$highscore , {$member->{affiliation} => $member->{name}}
    }
}

print Dumper $highscore;

# 5. JSON風Dumper
# 文字列合わせを強引にやっているところがちょっと気に入らない

print " \[\n";
for my $member(@people){
    print "  \{\n";
    for my $key(keys %$member){
        print "   $key : $member->{$key}\n";
    }
    print "  \}\n";
}
print " \]\n";