Perlにおける真偽
でもこれは下記のように書くことが出来ます。
sub func {
my %args = @_;
my $hoge = $args{hoge} || 'fuga';
# なんか処理
}
なんとこれを知っているだけで3行もコードが節約出来るんです。
とあって、短く書けてエレガントです。
これだけでも97%ぐらいはかまわないのですが、使い続けるとはまりどころがあります。
&func(hoge=>0); &func(hoge=>"");
として、$hogeに0や""を入れたい場合がそれ。
なぜなら、0や""がブール値コンテキストにおいて、偽となるからです。
Perlにおける真偽の規則は、らくだ本から引用ですが、
1. ""と"0"を除き、すべての文字列は真である
2. 0を除き、すべての数値は真である
3. すべてのリファレンスは真である
4. すべての未定義値は偽である
となってます。なので、$hogeに""や0を入れたくて、&func(hoge=>0);としたとしても
my $hoge = $args{hoge} || 'fuga';
において、$args{hoge}が偽と判断され、'fuga'になってしまいます。
これに対応するならば、definedを使って
my $hoge = (defined $args{hoge}) ? $args{hoge} : 'fuga';
などとすると、希望通りに動くようになります。
$args{hoge}が2回あるので、ちょっとかっこわるいですがね。
↓最近ようやく買ったのですが、やはり勉強になります。
オライリー・ジャパン (2002/09)
売り上げランキング: 28,553
それとかっこいいコードを書くなら、id:naoya氏監修の
翔泳社 (2005/09/06)
売り上げランキング: 7,023
がおすすめ。
コメント
おっしゃる通り0と""は注意しないといけないですね。私もPerlやり始めた頃にそれではまって、ラクダ本を改めて読み返しました。
投稿者: おいぬめ | 2006年01月22日 03:41
perl6 で導入される dor オペレータ (err と //) はこの問題を解決するためのもので、5.8.8 からは perl 5.8 系列でも使えるようになるみたいです。
http://dev.perl.org/perl5/list-summaries/2005/20050919.html
my $foo = shift // 5;
な感じですね。
投稿者: miyagawa | 2006年01月22日 13:43