2014-09-24 72 views
2
print !$num; 

当$ num是1时,我希望看到0.但是,没有任何打印。为什么?谢谢你的评论。

以下是我尝试过的一些测试。这与我的问题一致。

print 1;  # 1 
print 0;  # 0 
print !1; # (nothing) 
print !0; # 1 
print !1 == 0; # 1 

迈克尔

+0

'print 0 +!$ num;' – Slade 2014-09-24 19:06:05

回答

5

的“ ”假布尔在Perl是特殊的值,当评价为字符串被视为"",但在一个数值范围内,它被当作0

这就是为什么印刷否定真正价值的时候,你看到的空字符串:

$ perl -MData::Dump -e 'dd !1' 
"" 

要看到价值0,必须在数字环境中使用它。您可以通过简单地添加0的值做到这一点:

$ perl -MData::Dump -e 'dd 0 + !1' 
0 

有关布尔更多信息,请perldata - Scalar Values

+3

Re“Perl中默认的”false“布尔值是空字符串''''”。并非如此。这是一个包含'0'和空字符串的双重变量。 'perl -wE'say 0+!1;说0 +“”''只会警告后者的说法。 – ikegami 2014-09-24 19:11:38

+1

是的,我知道这在技术上是正确的。但是,我不确定如何以初学者的语言来构建。我会考虑并回来,或随意给我一个手。 – Miller 2014-09-24 19:17:14

+1

我认为最后的[答案](http://stackoverflow.com/a/1140031/176646)到了愚蠢的目标解释得很好,虽然它有点长。特别是最后一部分:“总之,你没有得到任何东西,你没有得到一个空字符串,并且你没有得到零。你得到一个变量,它既是空字符串也是0同时。“ – ThisSuitIsBlackNot 2014-09-24 19:19:53

4

按照docs

数字0,字符串 '0' 和 “”,空列表(),和民主基金 是在布尔上下文全是假的。其他所有值都是正确的。 否定了真正的价值!或者不返回一个特殊的错误值。 以字符串形式进行评估时,它被视为“”,但是作为数字,它会被视为0。大多数返回true或false的Perl运算符都以这种方式运行 。

print正在评估!1作为字符串,所以它被视为""


如果您在数值上下文评估!1,它将被视为0

$ perl -MData::Dumper -e'print Dumper !1+!1' 
$VAR1 = 0; 
0

在一般意义上,有一个品种,是true值和多种是false值。所以not true在布尔上下文中是有效的,但是当你print它是不明确的。