しゃのんあどべんとかれんだー 16 日目 (Perl のサブルーチンで引数の型をチェックする方法について) 匿名 匿名 この記事は、しゃのんあどべんとかれんだー 16 日目の記事です。  どうも、munepom (`@__munepom__`) です。 今回は、Perl 5 のサブルーチンで引数の型をチェックできる方法についてのおはなしです。 # 型がほすぃです 前職では、主に Java を使って開発していましたので、コード補完やメソッドの引数チェックは、IDE 任せで楽々な世界でした。 ですが、、、Perl 5 では、そうもいかないようですね。 サブルーチンに入ってくる引数の型をチェックできないと、予期せぬ引数を渡してしまうことで余計なバグが発生する可能性が生じます。 オブジェクトのフィールド定義レベルでは、Moose や Mouse、Moo が使えるっぽいですが、 サブルーチンの引数の型ってどうやってチェックできるのか、気になって調べてみました。 # なんかいろいろありますね 調べてみると、CPAN モジュールでいろいろあるみたいですね。 - Params::Validate - Data::Validator - Sub::Args - Smart::Args 今回は、、、とりあえず、Params::Validate を使ってみます。 (シャノンで採用実績がありますので。) # 引数の型チェックしてみます どんな風にチェックできるのかは、Params::Validate を検索していただくとして。 私は、こんなコードで試してみました。 ``` #!/usr/bin/env perl use strict; use warnings; use feature qw(say); use utf8; use Time::Piece; use Params::Validate qw(:all); use experimental 'signatures'; use experimental 'lexical_topic'; # perl 5.18 で、何か変更があったようですね。 ### fields my $hoge = 0; my $fuga = localtime; my @piyo = qw(foo bar baz); ### main validate_test($hoge, $fuga, \@piyo); ### sub sub validate_test (@_) { my ($hoge, $fuga, $piyo) = validate_pos( # 順々に、引数をチェックします。 @_, { # $hoge: 0 以上 100 未満の整数 type => SCALAR, regex => qr/^\d+$/, # ざっくり 0 以上の整数チェック callbacks => { # でも、100 未満がいいなー 'less than 100' => sub { shift() < 100 }, } }, { # $fuga: Time::Piece オブジェクト type => OBJECT, isa => 'Time::Piece', }, { # $piyo 配列の型をチェックするには、callbacks でゴリゴリやるしかないのでしょ うか。。。 type => ARRAYREF, } ); say $hoge; say $fuga; say $piyo; } ``` 上記サンプルコードで、例えば `$hoge = -1;` とすると、 `Parameter #1 ("-1") to main::validate_test did not pass regex check` のように怒られますw オブジェクトの型もチェックしてくれましたので、結構頼りになりそうですね。 速度に関しては、他のモジュールの方が良いらしいのですが。。。 時間ができたら、他のモジュールも確認してみたいです。 さらに安心できるコードを目指して(?) レッツ Enjoy! (・ω・)ノ Tweet Share Share Share Share