use argを試す。(実践編)
http://d.hatena.ne.jp/tokuhirom/20090824/1251132659
http://d.hatena.ne.jp/tokuhirom/20090826/1251271132
にひりずむ::しんぷる - args.pmがつかえそう
perlの世界に革命を引き起こすであろうモジュールargの使い方!(大げさに書いてみる)
perlで引数処理の基本は主に以下の通り
$\="\n"; use strict; use warnings; foo(1); sub foo { my $a = shift; print $a; } bar(2); sub bar { my ($a) = @_; # ()がミソ print $a; } baz(a=>3); sub baz { my (%arg) = @_; print "$arg{a}"; } hoge({a=>4}); sub hoge { my ($arg) = @_; print "$arg->{a}"; }
1と2だと引数が多くなると引数の順番でバグになることがあるため、
ハッシュを使って3や4を使うのだが見てわかる通り、一度@_から受け取って
それにキーを指定してと何だが無駄が多い。
(Params::Validateとかもあるけどこれもまだ微妙)
で、use argの何が素晴らしいのかというと(そのままだけれど)
・引数処理で冗長な部分を簡単に書ける
・指定した引数のキーが変数名としてそのまま使える
例えば、
foo(a=>1, c=>2); sub foo { my (%arg) = @_; my $a = (exists $arg{a}) ? $arg{a} : "default"; my $b = (exists $arg{b}) ? $arg{b} : undef; my $c = (exists $arg{c}) ? $arg{c} : undef; unless (defined $b) { print "err b is undef"; } } # ↑が↓こう書ける! sub foo { args my $a => { default => "default" }, my $b, my $c; }
使ってみた。t/より拝借
use strict; use warnings; $\="\n"; use args; print "------ p=3"; foo(p => 3); print "------ p=3 q=1"; foo(p => 3, q => 1); print "------ none"; foo(); exit; sub foo { args my $p => { isa => 'Int' }, # my $q => { optional => 1 }, # my $r => { default => 4 }; # print "p=$p" if defined $p; print "q=$q" if defined $q; print "r=$r"; }
------ p=3 p=3 r=4 ------ p=3 q=1 p=3 q=1 r=4 ------ none missing mandatory parameter named '$p' at a.pl line 16
基本的にキーに無い変数が指定されているとそこでエラーしてしまうみたい。
isa キーは値の種類を指定する?
optional キーは引数が入っていなくても無視して進める。(undefとして渡したいときに使う?)
default キーは引数に指定がなければ値を入れる。
ということらしい。