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 キーは引数に指定がなければ値を入れる。
ということらしい。