Perlリファレンス

definedとexists







definedとexists


ハッシュのキーの有無を確認するexistsという関数がありますが、
変数の有無を確認するdefinedとどうちがうの?
ってことについて。
ハッシュのキーを削除するdeleteと変数を削除するundefの違いも同じ原理です。

ハッシュは、キーと値がペアになったリストです。
↓のようなリストのハッシュがあったとします。
%hash=('key1'=>'value1','key2'=>'value2','key3'=>'value3');
この場合、
$hash{'key1'} eq 'value1'
$hash{'key2'} eq 'value2'
$hash{'key3'} eq 'value3'
こんな感じですが、
もしkey2を削除した場合、undefでは、
%hash=('key1'=>'value1','key2'=>undef,'key3'=>'value3');
こうなるので、
!defined($hash{'key2'});
ハッシュの値はありません。
しかし、key2自体は残っているため、
exists($hash{'key2'});
となります。
deleteで削除した場合は、
%hash=('key1'=>'value1','key3'=>'value3');
こんな感じになるはずです。

キーを指定して存在の有無を確認する場合はundefdefinedの組み合わせで通常は問題ないと思いますが、
keys関数などを使うときにはkey2が存在するとして処理されますのでundefでは問題が出てくると思われるので、
基本的にはハッシュの要素を削除する場合はdeleteexistsの組み合わせを使います。


関連






[編集] [新規] [削除] [バックアップ] [アップロード] [ログイン] [管理]
whwiki 1.3