« XML::FeedとAtom 1.0 | メイン | TextMateがすばらしく良い件 »

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回あるので、ちょっとかっこわるいですがね。


↓最近ようやく買ったのですが、やはり勉強になります。

プログラミングPerl〈VOLUME1〉
ラリー ウォール ジョン オーワント トム クリスチャンセン Larry Wall Jon Orwant Tom Christiansen 近藤 嘉雪
オライリー・ジャパン (2002/09)
売り上げランキング: 28,553


それとかっこいいコードを書くなら、id:naoya氏監修の

Perlプログラミング救命病棟
ピーター・J・スコット トップスタジオ 伊藤 直也
翔泳社 (2005/09/06)
売り上げランキング: 7,023


がおすすめ。

トラックバック

この一覧は、次のエントリーを参照しています: Perlにおける真偽:

» Link: Perlにおける真偽 : blog.nomadscafe.jp from Typemiss.net
Perlにおける真偽 : blog.nomadscafe.jp もう一つ,existsを忘れているとはまる時がありますね。 my $hoge = (def... [詳しくはこちら]

コメント

おっしゃる通り0と""は注意しないといけないですね。私もPerlやり始めた頃にそれではまって、ラクダ本を改めて読み返しました。

perl6 で導入される dor オペレータ (err と //) はこの問題を解決するためのもので、5.8.8 からは perl 5.8 系列でも使えるようになるみたいです。
http://dev.perl.org/perl5/list-summaries/2005/20050919.html

my $foo = shift // 5;

な感じですね。

コメントを投稿