きよへろの Perl コードをリファクタしようのコーナー

キーに姓、バリューに名を格納したハッシュに yasuhiro と引数を渡すことで onishi と返すスクリプト(今月始めに作成)

id:kiyoheroPerl を勉強しはじめたというのでリファクタしようのコーナーです。続くかどうかは分かりません。

#!/usr/local/bin/perl
use strict;
use warnings;

my %staff = (
    kondo  => 'junya',
    ito    => 'naoya',
    onishi => 'yasuhiro',
    danjou => 'nobuo',
    minowa => 'higepon',
);

my $user = shift or die "usage: $0 <name>";
print $staff{$user}, "\n" if $staff{$user};
  • 変数が入らない文字列はシングルクォートで。
  • 警告が出るように use warnings を使おう。
  • $ARGV[0] でもいいけど shift or die "usage ..." とかするとなんか今風。
  • ハッシュから値を取り出すのにループは要らない。
  • Perl Best Practice では後置 if は使うなとか言ってるけど余裕で使う。

と、思ったら value から key を検索してるのか。reverse 使えということで

#!/usr/local/bin/perl
use strict;
use warnings;

my %staff = (
    kondo  => 'junya',
    ito    => 'naoya',
    onishi => 'yasuhiro',
    danjou => 'nobuo',
    minowa => 'higepon',
);

my $user = shift or die "usage: $0 <name>";
my %reversed = reverse %staff;
print $reversed{$user}, "\n" if $reversed{$user};

こうかな。

#!/usr/local/bin/perl
use strict;
use warnings;

my %staff = (
    kondo  => 'junya',
    ito    => 'naoya',
    onishi => 'yasuhiro',
    danjou => 'nobuo',
    minowa => 'higepon',
);

my $user = shift or die "usage: $0 <name>";
print +{ reverse %staff }->{$user}, "\n";

こんな風にも書けるらしい。print + のあたりが微妙ですな。