古い記事
ランダムジャンプ
新しい記事
弾さんのご指摘により(感謝!)、
最近は 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 改訂版

この記事に言及しているこのブログ内の記事