変数などが定義されているかをテストする
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"; # 存在する