階層の各レベルをチェックする必要はありません。関心のある値を選択するだけでかまいません。exists
ハッシュ内のスロットが存在する場合のみ (未定義の値で存在する可能性があります)、定義されているかどうかをチェックしません。したがって、値が定義されていることを気にする場合はdefined
、存在するのではなく呼び出す必要があります。値が定義されていない場合、ブール値のコンテキストで false と評価されるため、入力を少し減らして例を次のように減らすことができます。
if ($Table{$key1}{$key2})
{
# do whatever
}
ただし、そのキーの値が定義されているが「false」(数値的にゼロに評価されるか、空の文字列である) である場合、これは偽陰性を引き起こす可能性があるため、可能性がある場合は定義されているかどうかを明示的に確認する必要があります。
if (defined $Table{$key1}{$key2})
{
# do whatever
}
autovivify したくない場合は$Table{$key1}
、最初にその存在を確認できます。これにより、一般的なケースの「最良の」方法が得られます。
if (exists $Table{$key1} and defined $Table{$key1}{$key2})
{
# do whatever
}
ハッシュ内のさまざまなフィールドに対してこれを何度も行う場合は、この作業を行うオブジェクト指向スタイルのアクセサー メソッドを追加することをお勧めします。
sub has_field
{
my ($this, $fieldName) = @_;
return exists $this->{data} && defined $this->{data}{$fieldName});
}
すでに読んでいると思いますが、関連するドキュメントをもう一度読んでも問題ありません。
ハッシュ要素または配列要素を指定する式を指定するとexists
、対応する値が未定義であっても、ハッシュまたは配列内の指定された要素が初期化されていれば true を返します。要素が存在しない場合、その要素は自動有効化されません。
...
ハッシュまたは配列要素は、定義されている場合にのみ true になり、存在する場合に定義されますが、その逆は必ずしも true とは限りません。