給定一個指定雜湊元素的表達式,如果雜湊中指定的元素曾經被初始化,即使對應的值未定義,也會傳回 true。
print "Exists\n" if exists $hash{$key};
print "Defined\n" if defined $hash{$key};
print "True\n" if $hash{$key};
exists 也可呼叫陣列元素,但其行為不太明顯,且與在陣列上使用 delete
緊密相關。
警告:強烈建議不要在陣列值上呼叫 exists
。刪除或檢查 Perl 陣列元素存在的概念在概念上並不一致,可能會導致令人驚訝的行為。
print "Exists\n" if exists $array[$index];
print "Defined\n" if defined $array[$index];
print "True\n" if $array[$index];
雜湊或陣列元素只有在定義且存在時才會為 true,但反之則不一定成立。
給定一個指定子程式名稱的表達式,如果指定的子程式曾經被宣告,即使它未定義,也會傳回 true。提及 exists 或 defined 的子程式名稱不算宣告它。請注意,一個不存在的子程式仍然可以呼叫:它的套件可能有 AUTOLOAD
方法,讓它在第一次呼叫時立即產生;請參閱 perlsub。
print "Exists\n" if exists &subroutine;
print "Defined\n" if defined &subroutine;
請注意,只要最後一個運算為雜湊或陣列鍵值查詢或子程式名稱,EXPR 就可以任意複雜
if (exists $ref->{A}->{B}->{$key}) { }
if (exists $hash{A}{B}{$key}) { }
if (exists $ref->{A}->{B}->[$ix]) { }
if (exists $hash{A}{B}[$ix]) { }
if (exists &{$ref->{A}{B}{$key}}) { }
儘管最深層的陣列或雜湊元素不會因為測試其存在而立即產生,但任何介入的元素都會產生。因此,$ref->{"A"}
和 $ref->{"A"}->{"B"}
將會因為上面 $key
元素的存在測試而產生。這發生在任何使用箭頭運算子的地方,甚至包括這裡
undef $ref;
if (exists $ref->{"Some key"}) { }
print $ref; # prints HASH(0x80d3d5c)
使用子程式呼叫(而不是子程式名稱)作為 exists
的引數會產生錯誤。
exists ⊂ # OK
exists &sub(); # Error