defined

変数などが定義されているかをテストする

構文

解説

defined は、EXPR の値が undef ではないかどうかを評価して真偽値を返します。 EXPR が省略されたら $_ が適用されます。

Perl で多くの操作では、失敗、ファイルの最後、システムエラー、未定義の変数、例外条件などを示すために undef が返されます。 undefined を使うことで、undef とそうでない値とを区別することができます。 (単純な真偽値テストでは undef、空文字列、 0 (数字の 0)、"0" (文字列の 0) を区別できず、 いずれも偽として扱われてしまいます。)

undef は妥当なスカラーなので、 その存在は必ずしも例外条件とは限りませんので注意してください。 例えば、pop は、引数が空の配列だった場合や、返すべき要素が undef だった場合に、 undef を返します。

次の例は、スカラー変数が未定義かどうかを評価して、その結果を出力しています。

my $var1;
print defined($var1) ? '定義済' : '未定義', "\n"; # 未定義

my $var2 = '';
print defined($var2) ? '定義済' : '未定義', "\n"; # 定義済

defined(&func) とすることで、サブルーチン func が定義済みかどうかをチェックすることもできます。 たとえ func の宣言の前であっても、その戻り値は影響を受けません。 また、定義されていないサブルーチンを評価しても問題ありません。 (これはサブルーチンで許される話であって、スカラー変数では許されません。)

print defined(&mysub1) ? '定義済' : '未定義', "\n";    # 定義済
print defined(&mysub2) ? '定義済' : '未定義', "\n";    # 未定義

sub mysub1 { }

defined は配列や連想配列の評価はサポートしていません。 もし defined を配列や連想配列で使ってしまうとエラーになってしまいますので注意してください。

my @ary;
print defined(@ary) ? '定義済' : '未定義', "\n";    # エラー

my %hash;
print defined(%ary) ? '定義済' : '未定義', "\n";    # エラー

連想配列の要素に defined を使うと、その値が undef かどうかを評価するだけであり、連想配列の中にキーが存在するかを評価するわけではありません。 もしキーの存在を評価したいなら、exists を使ってください。

my %hash = ( key => undef );
print defined( $hash{key} ) ? '定義済'  : '未定義',   "\n";    # 未定義
print exists( $hash{key} )  ? '存在する' : '存在しない', "\n";    # 存在する