defined関数 - 値が定義されているかを確認する
値が定義されているかを確認するにはdefined関数を使用します。
# 値が定義されているかの確認 $is_defined = defined $value;
定義されているとは
defined関数で判定できる定義されている値とはなんでしょうか。考えてみましょう。
変数宣言した場合は、代入による初期化を行わなかった場合は未定義となります。
# 宣言直後は未定義 my $value;
値を代入すると、値が定義されている状態になります。
# 値を代入したので定義されている状態になる $value = 5;
undef関数を使って、未定義値が代入されると値は未定義になります。
# undefを代入すると未定義になる $value = undef;
真偽値との違いは?
defined関数で判定できる「定義されている/定義されていない」というのは「真/偽」という概念とは異なることに注意してください。定義されているとは未定義値ではないということです。
一方、真であるというのはPerlにおける偽の値ではないということです。真偽値については以下の記事を参考にしてください。
「ハッシュの値が定義されている」と「キーが存在している」のとの違いは?
exists関数を使うとハッシュのキーが存在しているかどうかを確認することができます。キーが存在していることと、値が定義されていることは異なることです。
defined関数による判定とexists関数による判定の結果は異なることがあります。
次のような場合は、値は未定義だけれど、ハッシュのキーは存在しているといえます。
my %scores; # キーは存在するが、値は未定義 $scores{math} = undef;
配列とハッシュへのdefine関数は廃止予定
配列とハッシュは宣言されると未定義値にはならずに、空リストが代入されます。
my @nums; my %scores;
これは以下と同じです。
my @nums = (); my %scores = ();
配列やハッシュに対するdefined関数に使用は廃止予定となっています。代わりに単純に空リストであるかどうかをチェックしてください。
if (@nums) { ... } if (%scores) { ... }
便利なDefined-or演算子
値が未定義だった場合に右辺を代入できるDefined-or演算子という便利な演算子があるので紹介しておきます。
my $num; # 未定義だったら「defined-or演算」を使って3を代入 $num //= 3;
サンプル
defined関数を使って定義されているかどうかを確認するサンプルです。
use strict; use warnings; my $num = 3; if (defined $num) { print "Defined\n"; } else { print "Not defined\n"; }
定義されていないことが主要なロジックであった場合はunlessと組み合わせるのも読みやすいです。
use strict; use warnings; my $num; unless (defined $num) { print "Not defined\n"; }