この投稿はPerl 5 Advent Calendar 2015の24日目のものです。
バリデーション
言語自体にサブルーチンの引数の型を明確にする機能が無い1Perlですが、そこもライブラリを作る人がいるのがPerl界。
Data::ValidatorやSmart::Args、Params::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」です。
-
プロトタイプや実験的機能のサブルーチンシグネチャが一応あります。 ↩