【问题标题】:Some string values ("0", "", and " ") are defined, but (==undef)定义了一些字符串值(“0”、“”和“”),但是(==undef)
【发布时间】:2020-05-23 01:33:28
【问题描述】:

在我的 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"};
}

【问题讨论】:

  • 总是use strict; use warnings;。不要以$a 为例,考虑$x$y
  • 总是传递给他们需要的子一切,从不依赖子“看到”外部范围的值。所以test_a sub 应该将$a 作为参数(只是命名更好)。
  • defined 的文档很好地解释了它的用途。 undef 是独立的实体,不同于 0、'' 或其他任何值。

标签: perl undef


【解决方案1】:

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

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

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

【讨论】:

  • Grinnz,感谢您的澄清。现在我了解了我的主要困惑:1)eq和==之间; 2) 在定义和 undef 之间。我还注意到 eq 和 == 可以在字符串和数字之间交换,除了 undef。另一点是 undef $x 或 $x = undef 在分配(清除)值时适用于字符串和数字,但仅适用于数字比较。对我的观察有任何更正/修正吗?
  • @Douglas 抱歉,我并没有真正理解您想说的话。 eq 始终是字符串比较,== 始终是数字比较,存在不同字符串但数字相同的值,反之亦然。 undef 与任何一种比较都无关,字符串等于空字符串,数字等于 0。
  • 再次感谢您。我现在明白了这个问题。我的最后一条评论没有多大意义,因为我错误地使用了 == 和 undef(尽管它部分起作用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多