2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perl 5Advent Calendar 2015

Day 24

Data::Validatorを使うときにハッシュスライスで引数をすっきりさせる

Posted at

この投稿はPerl 5 Advent Calendar 2015の24日目のものです。

バリデーション

言語自体にサブルーチンの引数の型を明確にする機能が無い1Perlですが、そこもライブラリを作る人がいるのがPerl界。
Data::ValidatorSmart::ArgsParams::Validateなどがありますが、個人的によく使っているのはData::Validatorです。

Data::Validatorを使うと下記のように引数の型をチェックしたり、デフォルト値を設定したりといろいろできます。
Data::Validatorは非常に高機能で他にも機能がたくさんありますが、この投稿の趣旨とは違うので割愛します(詳しくはモジュールのドキュメントにて)。

sub plus {
  state $v = Data::Validator->new(
    a => { isa => 'Int' },
    b => { isa => 'Int', default => 1 },
  );
  my $args = $v->validate(@_);

  return $args->{a} + $args->{b};
}

plus(a => 1, b => 2); #=> 3
plus(a => 1);         #=> 2
plus(a => "hoge");    #=> error

ハッシュスライスですっきり

良い感じに扱えて大好きなData::Validatorなのですが、引数が全てハッシュリファレンスに入るため$args->{hoge}というように書かなければいけないため、地味に読みにくかったりタイプがだるかったりします。ハッシュスライスを利用することで、ハッシュ内の値を全て1行で変数に移すことができます。

ハッシュスライスの構文はこうです。

my %hash = (a => 1, b => 2, c => 3);
my @sliced1 = @hash{'a', 'b'}; #=> (1, 2)
my @sliced2 = @hash{qw/a c/};  #=> (1, 3)

ハッシュスライスを使って引数の変数をすっきりさせたのがこの例です。サブルーチンの本体が短いためこの例だけ見ると微妙感がありますが、もう少し長くなると読みやすさに差が出てきます。

sub plus {
  state $v = Data::Validator->new(
    a => { isa => 'Int' },
    b => { isa => 'Int', default => 1 },
  );
  my $args = $v->validate(@_);
  my ($a, $b) = @$args{qw/a b/};

  return $a + $b;
}

終わりに

ちょっとしたtipsですが地味に好きだったので紹介しました。
最終日の明日は@karupaneruraさんによる「マルチプロセスでもカジュアルにデータを共有したい - Test::SharedObject」です。

  1. プロトタイプや実験的機能のサブルーチンシグネチャが一応あります。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?