Hash::Extractなるものを触ってみた

なんかPerlのこと書くの久しぶりな気がする・・・。

ぼへーっとCPANRSS眺めてたらHash::Extractとかいうが目に付いたのでさっそく触ってみた。

以下概要のまんまだけど例。

 use Hash::Extract qw/hash_extract/;
 
 my %hash = ( red => 'apple' , blue => 'sky' );
 hash_extract( \%hash , my $blue );
 print $blue;  # sky

要は変数名と同じ名前のハッシュのキーのデータを取得するだけのものです。

これと同じ事をHash::Extract使わずに普通にやる場合、

 my $blue   = $hash{blue};
 my $red    = $hash{red};
 my $yellow = $hash{yellow};
 
 # もしくは
 my ($blue,$red,$yellow) = @hash{qw/blue red yellow/};

みたいな感じでキー名と変数名を二度書かないといけないのが一度で済むわけです。DRY原則万歳!便利!・・・なのか?

便利っちゃ便利なんだけど積極的に使うほどでもないかなぁ。

なんというかhash_extract関数の見栄えがあんまりよくない(個人的に)

 # なんだかダサい・・・
 hash_extract( \%hash , my ($blue,$red,$yellow) );

おぶじぇくと指向でやればなかなか良い感じに見える(かな)

 my $hash = Hash::Extract->new(\%hash);
 $hash->extract(my(
     $blue,
     $red,
     $yellow
 ));

ただ、これだけのためにオブジェクト化するのもなんだかなぁという問題はあるけども。

あと実装に関して、hash_extract内で@_を直接書き換えてたんでこれはスカラリファレンスで渡して書き換えたほうがいいんじゃないかとも思った。

というわけで使いどころとして、ハッシュから大量のデータを抽出したい時には使えるかもしれないね。

っんでまぁそれは置いておいて、引数で渡された変数の名前をどうやって動的に取得してるのか気になったのでソースを覗いてみたらPadWalkerモジュールのvar_nameという関数を発見。

へー。コレ使えばなんか色々と面白そうなモジュールが作れそうだな。今度試してみよう。