我使用存在,並且在規定的if語句所有的時間是否有Perl子程序存在和定義?
if (exists($a->{b}) and defined($a->{b})
是有沒有在同一時間做這兩個子程序?
更新:
似乎我沒有給出很好的示例代碼。對於更好的問題和匹配答案,請查看checking-for-existence-of-hash-key-creates-key。
我使用存在,並且在規定的if語句所有的時間是否有Perl子程序存在和定義?
if (exists($a->{b}) and defined($a->{b})
是有沒有在同一時間做這兩個子程序?
更新:
似乎我沒有給出很好的示例代碼。對於更好的問題和匹配答案,請查看checking-for-existence-of-hash-key-creates-key。
defined(...)
時exists(...)
是真實的,所以只能是真回答你問題是該子程序被稱爲defined
。
這是同樣的事情
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
,如果你只是想檢查的值關鍵存在(即使undef)然後只是使用存在()
這裏是一個相關的問題,很好地解釋它:What's the difference between exists and defined?
這是不對的。在最壞的情況下,當你使用' - >'操作符時,你無意中將'$ a'提升爲散列引用。 – mob
應該指出,我最初的假設是錯誤的(定義不會產生一個關鍵)。 –
nit:'defined'是一個操作符,而不是一個子操作符。 – ikegami