5

在我的 perl 脚本中,我使用if ($a == undef)了条件,我认为它与从 csv 文件if (not defined $a)$a读取的字符串相同。但是,我注意到定义了几个字符串值("", " ", "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"};
}
4

1 回答 1

7

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

要测试undef,不应该涉及等价测试:使用定义的函数。只有定义了它才能有一个有意义的字符串或数字值,你可以做后续的测试。

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

于 2020-02-06T22:35:16.450 回答