【发布时间】:2014-09-24 18:42:46
【问题描述】:
print !$num;
当 $num 为 1 时,我希望看到 0。但是,没有打印任何内容。为什么?感谢您的任何评论。
这是我尝试的一些测试。这与我的问题一致。
print 1; # 1
print 0; # 0
print !1; # (nothing)
print !0; # 1
print !1 == 0; # 1
迈克尔
【问题讨论】:
标签: perl
print !$num;
当 $num 为 1 时,我希望看到 0。但是,没有打印任何内容。为什么?感谢您的任何评论。
这是我尝试的一些测试。这与我的问题一致。
print 1; # 1
print 0; # 0
print !1; # (nothing)
print !0; # 1
print !1 == 0; # 1
迈克尔
【问题讨论】:
标签: perl
Perl 中的“false”布尔值是特殊值,当作为字符串计算时,它被视为"",但在数字上下文中,它被视为0。
这就是为什么在打印否定的真值时,您会看到空字符串:
$ perl -MData::Dump -e 'dd !1'
""
要查看值0,您必须在数字上下文中使用它。您可以通过简单地将 0 添加到值来做到这一点:
$ perl -MData::Dump -e 'dd 0 + !1'
0
有关布尔值的更多信息,请查看perldata - Scalar Values。
【讨论】:
''"。不是,不是。这是一个包含0 和空字符串的双重变量。 perl -wE'say 0+!1; say 0+""' 只对后一个语句发出警告。
根据docs,
数字 0、字符串 '0' 和 "" 、空列表 () 和 undef 在布尔上下文中都是错误的。所有其他值都为真。 对真实值的否定!或不返回一个特殊的假值。 当评估为字符串时,它被视为 "" ,但作为数字,它 被视为 0。大多数返回 true 或 false 的 Perl 运算符的行为 这边。
print 将 !1 评估为字符串,因此它被视为 ""。
如果您在数字上下文中评估!1,它将被视为0。
$ perl -MData::Dumper -e'print Dumper !1+!1'
$VAR1 = 0;
【讨论】:
一般意义上,true 有多种值,false 有多种值。所以not true 在布尔上下文中是有效的,但是当你print 它时会模棱两可。
【讨论】: