2013-06-04 30 views
7

鍵,如果有檢查出春天到存在存在

use warnings; 
use strict; 

my %h; 

然後我可以檢查按鍵的這個哈希中存在與exists

if (exists $h{k3}) { 
    print "k3 exists\n"; 
} 
else { 
    print "k3 doesn't exist\n"; 
} 

由於k3不存在,因此腳本會打印k3 doesn't exist

我還可以在k3檢查是否存在ka

if (exists $h{k3}{ka}) { 
    print "k3 ka exists\n"; 
} 
else { 
    print "k3 ka doesn't exist\n"; 
} 

不幸的是,這會在關鍵k3,讓另一

if (exists $h{k3}) { 
    print "k3 exists\n"; 
} 
else { 
    print "k3 doesn't exist\n"; 
} 

現在打印k3 exists

這對我的目的有點不幸。我寧願不想perl創建密鑰k3

我當然可以,檢查kak3喜歡的東西

if (exists $h{k3} and exists $h{k3}{ka}) 

不創建關鍵k3。但我想知道是否有一個更短(和更清潔)的方式來檢查k3內的ka

編輯問題是標記爲重複。不幸的是,提到的問題中提到的唯一答案no autovivification在那裏只有一個贊成,並且未被標記爲接受答案。爲了我的目的,no autovification是我需要知道的功能(而且我不知不覺之後)。所以,我在這裏留下我的問題,因爲我認爲在另一個問題上接受的答案不是最佳的答案。

不幸的是,至今沒有人回答no autovification我想接受。因此我可以回答我自己的問題。

+12

「自動激活」通常不會,你希望它是什麼:讓中間引用春天成立。爲了用'exists'測試嵌套結構,這是不幸的。 ''和各個級別在一起是通常的方法,但['不autovivification'](https://metacpan.org/module/autovivification)可能會有所幫助(我從來沒有使用過這個模塊)。 – amon

+2

['no autovivification'](http://search.cpan.org/perldoc?vivification) – mob

+3

@amon:您應該將其提升爲答案 – Borodin

回答

2

最簡單的事情就是你的窩IFS:

if (exists $h{k3}) { 
    print "k3 exists\n"; 
    if (exists $h{k3}{ka}) { 
    print "k3 ka exists\n"; 
    } 
    else { 
    print "k3 ka doesn't exist\n"; 
    } 
} 
else { 
    print "k3 doesn't exist\n"; 
} 
+1

有趣的使用「最簡單」這個詞:-)我會說最簡單的事情是使用「沒有autovivification」。 –

+0

最簡單的一點是,它只是繞着他所擁有的代碼移動,而沒有再添加任何其他代碼。也是最簡單的,它不執行冗餘測試。 –