为什么Perl认为-1是真的?

时间:2011-10-03 16:59:28

标签: perl boolean

这是一段常见的示例代码:

while (1) { 
    print "foo\n"; 
}

永远打印'foo'。

perl foo.pl
foo
foo
foo
...

while (0) { print "foo\n"; } 

像你期望的那样安静地死去:

perl test.pl

有人可以解释为什么这是一个有用的实现吗?这至少适用于5.10,Unix和MacOS X:

while (-1) { print "foo\n"; }

给出了

foo
foo
foo
...

7 个答案:

答案 0 :(得分:19)

每个非零整数的计算结果为true。 0总是false

答案 1 :(得分:18)

如果有的话,可以说-11更可能是真的,因为-1111..111b)是零的逐位否定(000..000b })。当需要返回真值时,BASIC和GW-BASIC使用-1。

无论如何,Perl认为那些意味着“空”或“没有”的值是错误的。大多数语言采用类似的观点。具体来说,整数零,浮点零,字符串零,空字符串和undef都是假的。

这是documented,虽然文档措辞不佳。 (它将()列为虚假值,但没有这样的值。)

除了一致性之外,采用这种方法非常有用。例如,它允许使用

if (@x)

而不是

if (@x != 0)

答案 2 :(得分:16)

来自perldoc perlsyn (Truth and Falsehood)

  

数字0,字符串'0'和'',空列表()和undef   在布尔上下文中都是false。所有其他值都是真的。

-1被认为是真的。

答案 3 :(得分:4)

只有0整数被视为false。任何其他非零整数都被视为真。

答案 4 :(得分:4)

问题是'为什么perl认为-1是真的?'

答案是在开发perl时,决定将某些值评估为false。这些是:

  • 0
  • 是undef
  • ''(空字符串)

对于为什么,我能想到一个合适的答案。它就是这样设计的。

答案 5 :(得分:2)

任何整数<> 0是真的。 0总是假的。

答案 6 :(得分:1)

Perl从awkC采取了此行为。

为什么C会解释here