関数の引数を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って感じで覚えておけると良さそうです.