定义了一些字符串值(“0”、“”和“”),但是 (==undef)

Dou*_*las 4 perl undef

在我的Perl脚本,我使用的if ($a == undef)情况下,我认为这是一样的if (not defined $a),这里$a是从一个CSV文件中读取一个字符串。但是,我注意到定义了几个字符串值("", " ", "0", "-0", "+0", "@", "a",以及许多其他空格和特殊字符),但也定义了undef. 如果undef只对数值,应该能顺利通过"0""+0""-0"。谁能解释一下?我现在明白我不应该用if ($a == undef)来替换if (not defined $a).

我的测试代码是:

@a_array = ("-1", "-0", "0", "+0", "1", "", " ", "@", "a", "\$", "-");
undef $a;
test_a();

foreach $a (@a_array) {
    $len_a = length($a);
    test_a();
}

sub test_a {
    if (defined $a) { print "a = $a is defined;  "} else {print "a = $a not defined; "}; 
    if ($a == undef) { print "a = $a (== undef);  "} else {print "a = $a (!= undef); "}; 
    if (length($a) > 0){ print "length of a is $len_a > 0 \n"} else {print "length of a is $len_a !> 0 \n"};
}
Run Code Online (Sandbox Code Playgroud)

Gri*_*nnz 7

Perl 有两个相等运算符:==and eq==测试每个值的数字形式是否在数字上相等。eq测试每个值的字符串形式是否按字典序相等。undef不是字符串或数字,如果用作字符串,则等效于空字符串,如果用作数字,则等效于 0(空字符串以及不以以下内容开头的任何字符串也是如此)看起来像一个数字)。发生这种情况时,您通常会收到警告。

要测试undef,不应涉及等价测试:使用定义的函数。只有定义了才能有有意义的字符串或数值,才能进行后续的测试。

长度函数返回undef时传递undef的,所以如果你想知道一个标量既定义,而不是长度为0,你只需要一个布尔检查:if (length $x)。0 和undef都是错误的结果。请注意,在 Perl 5.12 之前,这会导致警告,就像length undef尝试undef用作字符串一样eq