你不需要檢查每個等級的等級:你可以爲你關心的價值。 exists
不檢查定義,只有當散列中的槽存在(它可能存在一個未定義的值),所以如果你關心定義的值,你需要調用defined
而不是存在。如果沒有定義的值,它計算在布爾上下文中爲假,所以我們可以鍵入少一點,減少您的例子:
if ($Table{$key1}{$key2})
{
# do whatever
}
但是,如果該鍵的值定義,但「假」 (數值計算結果爲零,或爲空字符串),這可能會導致假陰性,所以我們應該明確地檢查definedness如果這是一個可能性:
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,如果在散列或數組中指定的元件曾經被初始化的表達,即使相應的值是未定義。如果該元素不存在,則該元素不會自動生效。
...
散列或數組元素可以是真實的,只有當它的定義,如果它存在定義,但反過來不一定成立。
請編輯您的問題使用代碼塊代碼。 – justkt 2010-04-27 17:36:53