在 Perl 脚本中,defined
是一个内置的关键字(或更准确地说,是一个函数),用于检查一个变量是否已经被定义且不是 undef
。defined
函数返回一个布尔值:如果变量已定义且不是 undef
,则返回真(1
),否则返回假(''
,即空字符串,在布尔上下文中被视为假)。
defined
可以用于标量变量(如 $var
)、数组元素(如 $array[0]
)、哈希键或值(如 exists $hash{'key'} && defined $hash{'key'}
,注意 exists
用于检查键是否存在,而 defined
用于检查对应的值是否已定义),以及文件句柄等。
下面是一些使用 defined
的例子:
my $var;
if (!defined($var)) {
print "Variable \$var is not defined.\n";
}
$var = "Hello, World!";
if (defined($var)) {
print "Variable \$var is defined and has a value.\n";
}
# 检查数组元素
my @array;
if (!defined($array[0])) {
print "Array element \$array[0] is not defined.\n";
}
$array[0] = "First element";
if (defined($array[0])) {
print "Array element \$array[0] is defined and has a value.\n";
}
# 检查哈希值(需要先检查键是否存在)
my %hash;
if (!exists($hash{'key'}) || !defined($hash{'key'})) {
print "Hash key 'key' does not exist or its value is not defined.\n";
}
$hash{'key'} = "Hash value";
if (exists($hash{'key'}) && defined($hash{'key'})) {
print "Hash key 'key' exists and its value is defined.\n";
}
请注意,在 Perl 中,未初始化的标量变量默认是 undef
,而未初始化的数组元素和哈希值在访问时也会被视为 undef
(尽管数组和哈希本身在声明后就被认为是已定义的)。
另外,defined
在用于文件句柄时,可以检查文件句柄是否已打开且有效。如果文件句柄是未定义的或已关闭的,defined
将返回假。但是,请注意,即使文件句柄是有效的,如果尝试从一个已到达文件末尾(EOF)的文件句柄中读取数据,defined
仍然会返回真,因为文件句柄本身仍然是有效的;在这种情况下,你应该使用其他方法(如 eof
函数)来检查是否已到达文件末尾。