defined defined EXPR defined
这个函数返回一个布尔值,表明 EXPR 是否是一个已经定义的数值。你处理的大多数数据都是已经定义的,但是一个标量如果不包含有效的字串,数字,或者引用值,那么就说它是未定义的数值,或者简称 undef。把一个标量变量初始化为一个特定的值将定义它,并且将一直保持已定义状态直到你给它赋一个未定义值或者在该变量上明确调用 undef 函数。
许多操作在异常条件下都返回 undef,比如文件末尾,使用一个未初始化的变量的数值,一个操作系统错误等等。因为 undef 只是假值的一种,所以简单布尔测试并不能分别 undef,数字零,和一个单字符字串,“0”——它们都等于假。当你正在进行的操作可能返回一个真正的空字串时,defined 函数可以让你可以区分未定义的空字串和定义了的空字串。
下面是一个测试一个来自某散列的标量值的片段:
print if defined $switch{D};
当象上面这样在散列元素上使用的时候,defined 只告诉你该数值是否定义,而不会告诉你该键字在散列里是否有记录。有可能出现这种情况:有一个键字,其值是未定义的;但键字本身仍然存在。使用 exists 判断某个散列键字是否存在。
在下面一个例子里,我们利用了有些操作在用光你的数据之后会返回未定义数值的传统:
print "$val\n" while defined($val = pop(@ary));
而在下面这个例子里,我们使用用于检索系统用户信息的 getpwent 函数获取同样的信息.
setpwent(); while(defined($name = getpwent())) { print "<<$naem>>\n"; } endpwent();
下面的例子从那些可能返回合法假值的系统调用中获取错误返回:
die "Can't readlink $sym: $!" unless defined($value = readlink $sym);
你还可以用 defined 检查一个子过程是否已经被定义。这样就有可能避免把一个不存在的子过程给破坏掉(或者是已经声明但尚未定义的子过程。):
indir("funcname", @arglist); sub indir { my $subname = shift; no restrict 'refs'; #这样我们就可以使用间接地使用 subname if (defined &$subname) { &$subname(@_); # 或者 $subname->(@_); } else { warn "Ignoring call to invalid function $subname"; } }
在聚集(散列和数组)上使用 defined 是不允许的。(以前这么做是报告该聚集的内存是否已经分配。)你可以使用简单的布尔测试来检查该数组或散列是否含有元素:
if (@an_array) { print "has array elements\n" } if (%a_hash) { print "has hash members\n" }又见 undef 和 exists。