print !$num;
当$num为 1 时,我希望看到 0。 但是,没有打印任何内容。 这是为什么呢? 感谢您的任何评论。
以下是我尝试过的一些测试。 这与我的问题一致。
print 1; # 1
print 0; # 0
print !1; # (nothing)
print !0; # 1
print !1 == 0; # 1
迈克尔
Perl 中的 "false" 布尔值是一个特殊的值,当它被计算为字符串时被视为""
,但在数字上下文中,它被视为0
。
这就是为什么在打印否定的 true 值时,您会看到空字符串:
$ perl -MData::Dump -e 'dd !1'
""
要查看值 0
,您必须在数字上下文中使用它。 您可以通过简单地将 0 添加到值中来执行此操作:
$ perl -MData::Dump -e 'dd 0 + !1'
0
有关布尔值的更多信息,请查看 perldata - 标量值。
根据文档,
数字 0、字符串 '0' 和 " 、空列表 (( 和 undef 在布尔上下文中都是假的。所有其他值均为真。 用 ! 否定真值或不返回特殊的假值。 当计算为字符串时,它被视为 " ,但作为一个数字,它 被视为 0。大多数返回真或假的 Perl 运算符的行为 这边。
print
将!1
评估为字符串,因此将其视为""
。
如果在数字上下文中评估!1
,则将其视为0
。
$ perl -MData::Dumper -e'print Dumper !1+!1'
$VAR1 = 0;
在一般意义上,有各种各样的值是true
的,有各种各样的值是false
的。因此,not true
在布尔上下文中是有效的,但在print
时却模棱两可。