Perl5 リファレンス



defined>abs

【文法】

defined EXPR

【説明】

EXPR が未定義値 undef でない値かどうかを Boolean 値で返します。EXPR が指定されて
いない場合には、$_ をチェックします。

失敗、ファイルの最後、システムエラー、初期化されていない変数、他の例外条件を意味
するために undef を返す関数は多々あります。この関数を使えば、undef を他の値と区
別することができます(簡単なBooleanテストでは、undef、zero、空の文字列、0 を区別
できないでしょう。これらは、すべて偽を意味してしまいます。)。undef はスカラーで
すので、その存在は、必ずしも例外条件を意味するわけではないことに注意してください。
pop は、引数が空の配列だった場合、もしくは、返すべき要素がたまたま undef だった
場合に、undef を返します。

サブルーチン &func が定義されているかをチェックするために、defined(&func) を使う
こともできます。

集合(連想配列、配列)で defined を使うのは、問題です。これは、集合用のメモリー
が割り当てられたかどうかをレポートするものでした。この動作は、今後のPerlバージョ
ンの機能から削除されるかもしれません。その代わりに、次の簡単なサイズテストを使っ
てください。

    if (@an_array) { print "has array elements\n" }
    if (%a_hash)   { print "has hash members\n"   }

連想配列の要素で使った場合は、値が定義されているかを調べることができますが、その
連想配列にキーが存在しているかはわかりません。キーの存在を調べるには、exists 関
数を使ってください。

【用例】


     print if defined $switch{'D'};
     print "$val\n" while defined($val = pop(@ary));
     die "Can't readlink $sym: $!"
          unless defined($value = readlink $sym);
     sub foo { defined &$bar ? &$bar(@_) : die "No bar"; }
     $debugging = 0 unless defined $debugging;

Note:  Many folks tend to overuse `defined', and
then are surprised to discover that the number `0'
and `""' (the zero-length string) are, in fact,
defined values.  For example, if you say

    "ab" =~ /a(.*)b/;

The pattern match succeeds, and `$1' is defined,
despite the fact that it matched "nothing".  But
it didn't really match nothing--rather, it matched
something that happened to be zero characters
long.  This is all very above-board and honest.
When a function returns an undefined value, it's
an admission that it couldn't give you an honest
answer.  So you should use `defined' only when
you're questioning the integrity of what you're
trying to do.  At other times, a simple comparison
to `0' or `""' is what you want.

See also the undef, exists, and ref entries
elsewhere in this document.


Perl5リファレンスに戻る