サブルーチンに初期値を持たせる方法

サブルーチンで初期値を持っておきたい時や、サブルーチン呼び出し時に引数で動作を色々と変更したい時などに便利なコード。 どこで見たのかは忘れたけど、いいなぁと思って真似して使っていた。

1
2
3
4
5
6
7
8
9
sub hoge {
    my %elm = (
        foo => "FOO",
        bar => "BAR",
        @_
    );
    print $elm{foo}."n";
    print $elm{bar}."n";
}

実際の呼び出し方法は、

1
2
3
&hoge;
&hoge(foo => "FOO");
&hoge(bar => "bar");

な感じ。

ただ、欠点がある。
引数の数がちゃんと合っていないとwarningsで警告されるのだ。

なので、最近はリファレンスを使っている。
CGI.pmなんかでも使われている。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sub fuga {
    my $elm = shift;
    $elm = {} unless defined $elm;
    my %elm = (
        foo => "FOO",
        bar => "BAR",
        %{$elm}
    );
    print $elm{foo}."n";
    print $elm{bar}."n";
}

呼び出し方も括弧が一組付くだけであまり変わらない。

1
2
3
&fuga;
&fuga({foo => "FOO"});
&fuga({bar => "bar"});

最近覚えたのだが、

1
$elm = {} unless defined $elm;

この行は、もっと簡単に

1
$elm ||= {};

こうやって書くこともできる。

Comments

comments powered by Disqus