Perl 「 defined 関数 」で undef を検知する (0x1a)

セラ (perlackline)

2013年09月27日 18:32



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









関連記事