Masteries

技術的なことや仕事に関することを書いていきます.

小ネタ: Perlのhashとデフォルト値

関数の引数をhashで受けて, 未定義の場合はデフォルト値を設定したい... という場合があるとします. まあだいたい, defined-orを使って次のように書くのではないでしょうか:

sub myfunc {
    my %args = @_;

    return $args{foo} // 'default';
}

myfunc(foo => 'yeah'); # => 'yeah'
myfunc(); # => 'default'

一方で undef を渡せるようにしたいという場合, この実装だとデフォルト値に上書きされてしまいます.

myfunc(foo => undef); # => 'default' XXX: undef が返ってきて欲しいのに...

そういうときは, exists を使って次のように書くという手が使えます:

sub myfunc {
    my %args = @_;

    return exists $args{foo} ? $args{foo} : 'default';
}

myfunc(foo => 'yeah'); # => 'yeah'
myfunc(); # => 'default'
myfunc(foo => undef); # => undef;

もし$argsがhashのリファレンスならこうですね: exists $args->{foo} ? $args->{foo} : 'default';

テストヘルパーとか作る時によく使うsnippetって感じで覚えておけると良さそうです.