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');
こんな感じになるはずです。
キーを指定して存在の有無を確認する場合は
undefと
definedの組み合わせで通常は問題ないと思いますが、
keys関数などを使うときにはkey2が存在するとして処理されますので
undefでは問題が出てくると思われるので、
基本的にはハッシュの要素を削除する場合は
deleteと
existsの組み合わせを使います。
関連