undefと0と空文字列

「サブルーチンに初期値を持たせる方法」の中で書いた、

最近覚えたのだが、

1
$elm = {} unless defined $elm;

この行は、もっと簡単に

1
$elm ||= {};

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

は、正確には違うということに気づかされた。

まるごとPerl! Vol.1」という本に、Perl6の事について触れられていたのだが、その中で「||=」について書かれていた。
definedという関数は、未定義(undef)かどうかを判定して返す関数で、未定義以外の場合は真を返す。
なので、例えば$elmが「0」や「空文字列」だった場合は、左辺の式は実行されない。

一方「||=」は、$elmが「0」や「空文字列」であっても代入が実行される。
「0」も「空文字列」も「undef」も「偽」として評価されるためだ。

…ただ、「use strict」の環境下では、突然出てきた変数は警告されるので、通常は不要。
ほとんどの場合、これらの文はサブルーチンの中で引数が渡されたかどうかを監視するのを目的として使われる。

ちなみにPerl6では、関数ではなく演算子でもundefかどうかを調べられるらしい。

1
$elm //= {};

正確な意味で代用できる、という事ですね。

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。