Perl 「 defined 関数 」で undef を検知する (0x1a)
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x1a 回。
前回紹介した未定義値 undef を defined 関数を使って検知する。
defined 関数
変数の値が undef になるのは、「初期化していない変数だけ」ではない様です。
例えば、Perl のプログラムから外部のファイルの読み込みを行った場合、ファイルの終わり (EOF) を示す値として undef が返ってきます。
また、システムエラーの戻り値として undef が返ってくる場合もあります。
そうした場合に、
はたして対象となる変数の値が undef なのか、それとも別の値なのかを確かめたいという要望を defined 関数は満たしてくれます。
英語の define (デファイン) は「定義する」という意味を持っています。このことから defined 関数は、「定義済み」かどうかを判定します。
$line = ;
if ( defined($line) ) {
print "\$line : $line\n";
} else {
print "入力がありませんでした。\n";
}
if や while 等の制御構文では defined 関数を使わなくても値の 真偽 を判定出来ますが、それらは数値 0 や 空文字 を 偽 と判定します。
翻って
defined 関数は、純粋に undef の場合のみ 偽 を返します。対象になる値が数値 0 や、空文字 の場合でも、それを 真 と判定します。
別の言い方をすると、if や while では、数値 0 や 空文字 の出現によってブロック内の処理をスキップしますが、defined 関数ではブロック内の処理を行います。
試しに次の様なコードを書けば、
$empty = ''; # 空文字を $empty に代入する
if ( defined($empty) ) { # 真 と判定する
print "Defined !\n";
} else {
print "Undefined !\n";
}
if ($empry) { # 偽 と判定する
print "True !\n";
} else {
print "False !\n";
}
実行結果は以下の様になります。
Defined !
False !
0x1a-> 0x1b へ
今の僕では defined 関数の有用な利用方法はわかりませんが、想像するにまかせると、外部から入力を受け付ける処理で、値が 空文字 や数値 0 だと困る場合は制御構文の条件式で判定し、空文字 や数値 0 でも問題ない (正式な値として扱う) 場合は defined 関数を使うのかしらと思っています。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :
「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x1b) へ続く。
過去記事 RSS
関連記事