月曜日に「民主党 ブロガーと前原代表との懇談会」に行くといったら、妻に「弾はますます何者かわけわからなくなってるね」とからかわれたので、一応<まだ>Perlがで書ける事を証明しておこうというEntry.

naoyaのはてなダイアリー - きよへろの Perl コードをリファクタしようのコーナー
キーに姓、バリューに名を格納したハッシュに yasuhiro と引数を渡すことで onishi と返すスクリプト(今月始めに作成)
#!/usr/local/bin/perl -w
use strict;
my $first = shift or die "$0 <firstname>";
my %last_name_of;
foreach my $line (<DATA>){
    chomp $line;
    last if $line eq '__END__';
    my ($last, $first) = split /\s+/, $line;
    $last_name_of{$first} = $last;
}
print $last_name_of{$first}, "\n";
__DATA__
kondo junya
ito naoya
onishi yasuhiro
danjou nobuo
minowa higepon
__END__
  • ここではデータ構造をRefactorしてみた。こうしておけば余計なquotationは不要になるし、__DATA__を外部ファイルに移した場合も最小限の変更で済む。
  • 逆に対象者のレベルを考えて、+{ reverse %staff }->{$user}のような too perlish な記法は避けた
  • %last_name_ofという記法はDamian流。
  • これの初期化の方法を変えたので、reverse()が不要になった。もちろん
    my %last_name_of = reverse qw(
      kondo junya
      ito naoya
      onishi yasuhiro
      danjou nobuo
      minowa higepon
    );
    
    という方法もあったが、ここでforeach{}をケチると、折角教習で書いているscriptからloopがなくなってしまうという点を考慮した。ちなみに私は普段はforeachとは書かずforと書く。
  • 一応last if $line eq '__END__';で、__END__ token 以下を読まなくしてある。これでPODを尻付けしても大丈夫。

さらに突き詰めると、Hatena::Staffとか作ってそこで->last_name_of()とかいうMethodを作ってとかいう話にもなりそうだが、このレベルでOOPるのはいくらなんでも「まさかりでひげそり」というものだろう。

と、こんなところで。

Dan the Camel Abuser