defined EXPR
defined

傳回布林值,表示 EXPR 是否具有非未定義值 undef。如果沒有 EXPR,則會檢查 $_

許多運算會傳回 undef 以表示失敗、檔案結束、系統錯誤、未初始化變數和其他例外狀況。這個函式讓您可以區分 undef 和其他值。(簡單的布林測試無法區分 undef、零、空字串和 "0",因為這些值都是 false。)請注意,由於 undef 是有效的純量,因此它的存在並不一定表示例外狀況:pop 在其引數為空陣列要傳回的元素碰巧是 undef 時,會傳回 undef

您也可以使用 defined(&func) 來檢查子常式 func 是否曾經被定義過。傳回值不受 func 的任何向前宣告影響。未定義的子常式仍然可以被呼叫:其套件可能有 AUTOLOAD 方法,讓它在第一次被呼叫時立即產生;請參閱 perlsub

不再支援在集合(雜湊和陣列)上使用 defined。它用於回報該集合的記憶體是否已配置。您應該改用簡單的尺寸測試

if (@an_array) { print "has array elements\n" }
if (%a_hash)   { print "has hash members\n"   }

在雜湊元素上使用時,它會告訴您該值是否已定義,而不是該鍵是否存在於雜湊中。後者應使用 exists

範例

print if defined $switch{D};
print "$val\n" while defined($val = pop(@ary));
die "Can't readlink $sym: $!"
    unless defined($value = readlink $sym);
sub foo { defined &$bar ? $bar->(@_) : die "No bar"; }
$debugging = 0 unless defined $debugging;

注意:許多人傾向過度使用 defined,然後驚訝地發現數字 0""(零長度字串)實際上是已定義的值。例如,如果您說

"ab" =~ /a(.*)b/;

模式比對會成功,而且 $1 已定義,即使它比對「無」。它並未真正比對不到任何東西。相反地,它比對到一個剛好是零個字元長的字串。這一切都非常光明正大且誠實。當一個函式回傳未定義的值時,表示它承認無法給您一個誠實的答案。因此,您應該只在質疑您嘗試執行的動作的完整性時才使用 defined。在其他時候,您想要的只是與 0"" 進行簡單的比較。

另請參閱 undefexistsref