为什么Perl';“s规范”;“真的”;及;假;内部PVNV值?
Perl有一个规范的“true”和“false”值,它用于为什么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
的布尔求反代码>或非
#!/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
两种情况都没有警告?美好的谢谢