2012-10-29 21 views

回答

2

defined(...)exists(...)是真實的,所以只能是真回答你問題是該子程序被稱爲defined

+0

這是不對的。在最壞的情況下,當你使用' - >'操作符時,你無意中將'$ a'提升爲散列引用。 – mob

+0

應該指出,我最初的假設是錯誤的(定義不會產生一個關鍵)。 –

+0

nit:'defined'是一個操作符,而不是一個子操作符。 – ikegami

6

這是同樣的事情

if (defined($a->{b})) 

關於在評論中回覆,defined不會實例鍵。

>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say 0+keys(%$a);" 
0 

>perl -E"if (defined($a->{b})) { } say 0+keys(%$a);" 
0 

->另一方面,autovivifies爲正常。

>perl -E"if (defined($a->{b})) { } say $a || 0;" 
HASH(0x3fbd8c) 

但這是exists過的情況。

>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say $a || 0;" 
HASH(0x81bd7c) 

如果你想避免自動激活,你會使用

>perl -E"if ($a && defined($a->{b})) { } say $a || 0;" 
0 

>perl -E"no autovivification; if (defined($a->{b})) { } say $a || 0;" 
0 
+0

不使用時,使用散列上定義的您無意中創建密鑰。 –

+0

「不,它不是」是5yo的答案。不要與沒有支持的人相抗衡,或至少驗證你的主張。我的代碼永遠不會創建密鑰。它可以在'$ a'中創建一個哈希引用,但您的原始代碼也可以。 (這是創建哈希引用的'''''',這是在你的代碼和我的代碼中執行的第一件事。) – ikegami

+2

@EricFossum你可能會想到autovivification,如果你在二維結構,比如'defined $ foo - > {bar} {baz}',它創建了子$'foo - > {bar}'但不是baz。 – TLP

1
  • 如果該鍵存在(即使是undef值)存在()檢查
  • ()定義檢查是否有定義

,如果你只是想檢查的值關鍵存在(即使undef)然後只是使用存在()

這裏是一個相關的問題,很好地解釋它:What's the difference between exists and defined?

相關問題