傳回布林值,表示 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
或 ""
進行簡單的比較。