2013-08-23 85 views
4

我来自C++的背景,并试图用Perl开始学习Perl。然而,这段代码在第二章中已经留下了困惑:为什么不2 == 4返回false?

#!/usr/bin/perl 
use warnings; 
print"Is two equal to four? ", 2 == 4, "\n"; 

当我运行的代码,这是输出:

Is two equal to four? 

这在下文中进一步解释说,2 ==价值4是不确定的,但这对我来说似乎令人困惑和反直觉。两个显然不等于四,并且4和4之间的相同比较将产生真实,导致在输出结束时产生'1'。为什么表达式不会返回false?

+0

Perl6在bool主题中更直观http://faq.perl6.org/ – teodozjan

+1

'2 == 4? '是':'不' – ikegami

+3

另请参见[错误的定义](http://stackoverflow.com/questions/1036347/how-do-i-use-boolean-variables-in-perl/5655485#5655485) – ikegami

回答

12

它的确如此。但是,Perl没有truefalse。它具有真实和虚假的价值。

返回布尔值的运算符在返回true时将返回1,如果为false,则返回一个数值为零的特殊值和字符串化后的空字符串。我建议你numify通过添加零结果:

use warnings; 
print"Is two equal to four? ", 0+(2 == 4), "\n"; 

输出:

Is two equal to four? 0 
+1

不要忘记提及0E0虽然它是数字0不是假事件http://stackoverflow.com/questions/129945/what-does-0-but-true-mean-in-perl – teodozjan

+1

@teodozjan *字符串*''0E0“'在数字上是零,但是是真的。这是因为真相首先由字符串值确定,然后由数值确定。这个怪癖与这个问题或我的答案无关。 – amon

+0

恕我直言,对于perl逻辑系统的新手来说,值得一提的是。 – teodozjan

1

Perl没有truefalse类型,所以评估任何一种比较的结果都不是它们。你会得到相同的值。

0

也是一样的PHP:

echo "[" . (0 == 0) . "][" . (0 == 1) . "]"; 

将输出如下:

[1][] 

布尔值TRUE被转换为s敲“1”。布尔FALSE被转换为“”(空字符串)。这允许在布尔值和字符串值之间来回转换。

希望这有助于:)

问候

克里斯托弗

+0

在Perl中,规范的假值具有与其相关的数值('0')。这可以防止在您第一次将其用作数字时发出警告。 –

5

的一种方式,看看perl的是如何评估这一expresion是应用三元运算符。如果左侧的表达式为真,它将在问号后面返回值,否则如果表达式为False,则它将返回冒号后面的值。

use strict; 
use warnings; 

print "Is two equal to four? ", 2 == 4 ? 'True' : 'False', "\n"; 
#This print False.