为什么Perl中的'0'错误?

时间:2013-01-09 01:25:06

标签: perl

首先,我来自C,Java,Python背景。最近,我开始为我的新工作学习Perl,我很好奇'0'(0-string)是假的。

我已经读过这个特殊的行为是为什么Perl必须有<>运算符来读取文件的原因所以它对我来说比现在更像是一个设计缺陷。但是,我也知道Perl是一种成熟的语言,我猜这种行为有其用途,否则它很久以前就会被修复。

那么'0' = false在什么情况下会有用?

6 个答案:

答案 0 :(得分:11)

如果您读到它与<>有任何关系,那么您正在阅读不良来源;我无法想象这个说法来自何处。

'0'是错误的,因为几乎所有perl都不区分以数字形式和字符串形式存储的数字;在布尔测试中这样做会对抗这种粒度。

在语言(Python,Javascript?)中,'0'为真,我觉得很奇怪''是假的;为什么要为一个字符串而不是另一个字符串进行异常?

答案 1 :(得分:9)

Perl没有明确的输入,它对类型的解释高度依赖于上下文。例如:

$a = "2b";
$b = "3a";
$c = $a + $b;
print $c;

收益率为5。

另一方面......

$a = "b2";
$b = "3a";
$c = $a + $b;
print $c;

收益率为3。

和...

$a = "b2";
$b = "3a";
$c = $a.$b;
print $c;

产生b23a

所以“'0'(字符串)”不是字符串,数字或bool,直到你使用它,然后它可以是由它的使用决定的任何东西。在您尝试操作之前,不会确定类型。然后Perl评估上下文以努力实现您的意图并采取相应行动。这是一个功能,以及为什么在Perl中有许多方法可以做。它当然可以导致大量令人困惑的代码,但非常适合1-liners,混淆和Perl高尔夫。

答案 2 :(得分:7)

Perl 窃取继承了许多其他语言的功能,包括C,awk,Bourne shell和其他一些语言。

在C中,任何0值都为false,任何非零值都为true。 Perl只使用相同的语义。

事实上,Perl在标量或布尔上下文中可以使用的内容比C更多,特别是字符串,这意味着Perl有多个错误值。

使整数0为false对C程序员来说非常有意义。将空字符串""设为false也是有道理的。由于Perl可以将相同的标量视为数字或字符串,因此将字符串"0"设为false几乎是不可避免的。

例如:

$x = 2;
$x -= 2;
print "x = $x\n"; # prints "x = 0"
if ($x) {
    print "A C programmer would be surprised to see this\n";
}

$x = "";
$x .= chr(48);
# Now $x eq "0", a string value that was built without reference to
# the number zero -- but it's nearly the same thing as the number 0.
print "\$x = $x\n"; # pritn "x = 0"
if ($x) {
    print "A C programmer would be equally surprised to see this\n";
}

如果从头开始设计Perl而不借用其他语言的这么多功能,可能在字符串和数字之间做了更强的区分,而不是将它们组合在一起作为标量。鉴于这种假设的类Perl语言,很可能空字符串和数字0将为false,但字符串"0"将为真 - 您需要显式转换才能转换为数字0到字符串"0"

但Perl就是这样。

答案 3 :(得分:7)

理想情况下,内部存储格式在Perl中永远不应该重要。无论是零存储在IV,UV,NV,PV等中,零都为零

事实上,因为它可以,Perl将以可能让您感到惊讶的方式更改存储值的格式。如果字符串0为真,则以下内容将打印为“true”:

$x = 0;
print("$x\n");
if ($x) {
   print("true\n");
} else {
   print("false\n");
}

答案 4 :(得分:2)

Perl有许多被视为“false”的值:undef,零,字符串"0",空字符串,变换为空字符串的特殊布尔值或空列表取决于上下文,以及为布尔上下文重载的对象。

其中大部分(undef,零,空字符串,特殊值,对象)实际上非常有用。字符串"0"是假的源于perl实现标量和错误的方式:标量包含字符串部分和数字部分。要确定,如果值为false,则首先查询字符串部分 。为什么这有必要?

my $false_ish = 0;  # the scalar contains only a number
'' . $false_ish;    # force stringy context. the scalar now contains stringy portion.
if ($false_ish) { ... } # string portion is consulted first...

如果没有这个,一旦你在需要字符串的地方使用它,数字零就会失去它的错误。另一方面,这允许"0 but true",一个真正的字符串,它是数字零,"0E0",它是零的科学记数法,但也计算为真。

答案 5 :(得分:0)

0在C中也等于false - 在几种“遗留”编程语言中它等于假,可能是由于0与二进制和电路的固有联系,其中0表示“无电荷”。

在任何情况下,较新的语言通常都会继承以前的语言行为和解释。自从任何高级编程语言抽象出来之后,0的二进制意义是“不收费”或“收费是错误的”已经很久了,但语义的一小部分仍然保留在最现代的编程语言中。

另外 - 据我所知,它与&lt;&gt;无关。 - 你在哪里读到的?