exists EXPR

給定一個指定雜湊元素的表達式,如果雜湊中指定的元素曾經被初始化,即使對應的值未定義,也會傳回 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