Perl の defined と exists
2007-10-11-3 
[Programming]
弾さんのご指摘により(感謝!)、
最近は perl でのハッシュキーの存在確認に exists を
使うようにしています。
- 404 Blog Not Found:perl, et al. - キーの存在確認
http://blog.livedoor.jp/dankogai/archives/50849003.html
それはそうと、やっかいなのが、ハッシュでツリーを扱うとき。
一度でも $a->{"a"}->{"b"} を見に行くと、
$a->{"a"} が存在するようになっちゃうんですよね。
確認するためにアクセスしただけなのに、
途中ノードができちゃうなんてちょっとなあ…。
何か良い方法はないでしょうか?
下記、defined と exists の動作確認スクリプト:
追記071012:
弾さんにツリーを壊さない方法を教えていただきました。
ありがとうございます!
- 404 Blog Not Found:perl - 木を痛めない枝チェック
http://blog.livedoor.jp/dankogai/archives/50929096.html
 最近は perl でのハッシュキーの存在確認に exists を
使うようにしています。
- 404 Blog Not Found:perl, et al. - キーの存在確認
http://blog.livedoor.jp/dankogai/archives/50849003.html
それはそうと、やっかいなのが、ハッシュでツリーを扱うとき。
一度でも $a->{"a"}->{"b"} を見に行くと、
$a->{"a"} が存在するようになっちゃうんですよね。
確認するためにアクセスしただけなのに、
途中ノードができちゃうなんてちょっとなあ…。
if (defined %{$a->{"a"}}) { ...
といった方法で確認しているのですが、なんかバッドノウハウ的。何か良い方法はないでしょうか?
下記、defined と exists の動作確認スクリプト:
use strict;
use warnings;
my $a;
# exists
if (exists $a->{"a"}) {
    print qq(\$a->{"a"} exists\n);
} else {
    print qq(\$a->{"a"} does not exist\n);
}
if (exists $a->{"a"}->{"b"}) {
    print qq(\$a->{"a"}->{"b"} exists\n);
} else {
    print qq(\$a->{"a"}->{"b"} does not exist\n);
}
if (exists $a->{"a"}) {
    print qq(\$a->{"a"} exists\n);
} else {
    print qq(\$a->{"a"} does not exist\n);
}
# defined
if (defined $a->{"c"}) {
    print qq(\$a->{"c"} is defined\n);
} else {
    print qq(\$a->{"c"} is not defined\n);
}
if (defined $a->{"c"}->{"b"}) {
    print qq(\$a->{"c"}->{"b"} defined\n);
} else {
    print qq(\$a->{"c"}->{"b"} does not defined\n);
}
if (defined $a->{"c"}) {
    print qq(\$a->{"c"} is defined\n);
} else {
    print qq(\$a->{"c"} is not defined\n);
}
# 途中ノードの存在確認
if (defined %{$a->{"a"}}) {
    print qq(%{\$a->{"a"}} is defined\n);
} else {
    print qq(%{\$a->{"a"}} is not defined\n);
}
if (defined %{$a->{"c"}}) {
    print qq(%{\$a->{"c"}} is defined\n);
} else {
    print qq(%{\$a->{"c"}} is not defined\n);
}
追記071012:
弾さんにツリーを壊さない方法を教えていただきました。
ありがとうございます!
- 404 Blog Not Found:perl - 木を痛めない枝チェック
http://blog.livedoor.jp/dankogai/archives/50929096.html
| ■初めてのPerl   | ■続・初めてのPerl 改訂版   | 
この記事に言及しているこのブログ内の記事
 
