返回一个布尔值,指示 EXPR 是否具有除未定义值 undef
以外的值。如果 EXPR 不存在,则检查 $_
。
许多操作返回 undef
以指示失败、文件结尾、系统错误、未初始化变量和其他异常情况。此函数允许您区分 undef
与其他值。(简单的布尔测试无法区分 undef
、零、空字符串和 "0"
,它们都是假值。)请注意,由于 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
或 ""
的简单比较是你想要的。