为什么Perl';“s规范”;“真的”;及;假;内部PVNV值?

为什么Perl';“s规范”;“真的”;及;假;内部PVNV值?,perl,perlguts,Perl,Perlguts,Perl有一个规范的“true”和“false”值,它用于的布尔求反或非 #!/usr/bin/env perl use strict; use warnings; use Data::Dumper; print Dumper !1; # outputs $VAR1 = ''; print Dumper !!1; # outputs $VAR1 = 1; 到目前为止一切都很好 但是,当我看这些值时,很明显它们并不等同于literal'和1,它们都是SV PVNV值 $ perl

Perl有一个规范的“true”和“false”值,它用于
的布尔求反

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

print Dumper !1;    # outputs $VAR1 = '';
print Dumper !!1;   # outputs $VAR1 = 1;
到目前为止一切都很好

但是,当我看这些值时,很明显它们并不等同于literal
'
1
,它们都是SV PVNV值

$ perl -MDevel::Peek -E 'Dump ""; Dump !1;' 2>&1 | grep '^SV'
SV = PV(0x15e5140) at 0x1603298
SV = PVNV(0x15e3010) at 0x7814b0

$ perl -MDevel::Peek -E 'Dump 1; Dump !!1;' 2>&1 | grep '^SV'
SV = IV(0xfce228) at 0xfce238
SV = PVNV(0xfae030) at 0x7819f0
我已经用Perl5.16.3和Perl5.20.0对此进行了测试


PVNV不是比简单的静脉注射大很多吗?这是Perl用内存换取速度的例子吗?

我相信这里的答案是肯定的,PVNV更大,但Perl在内存中只保留一个真值副本和一个假值副本,所以脚本中有很多布尔值的内存不会用完

我从这个
Devel::Peek
输出中的引用计数(
REFCNT
)中得到:

$ perl -MDevel::Peek -E 'Dump !1; Dump !!1;'  2>&1 | grep REFCNT
  REFCNT = 2147483646
  REFCNT = 2147483644

不仅仅是布尔否定;这些值由许多内置项返回

实际上没有内存问题,因为每个内存只有一个实例


特别是假值必须是PVNV,因为它的字符串值
'
和数值
0
不能相互派生(至少不会触发警告)。

啊,所以它允许你执行
0+!1
“”!1
两种情况都没有警告?美好的谢谢