3

Perl 有一个规范的 "true" 和 "false" 值,它用于布尔否定的情况!or not

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

print Dumper !1;    # outputs $VAR1 = '';
print Dumper !!1;   # outputs $VAR1 = 1;

到目前为止一切都很好。

但是,当我查看这些值时Devel::Peek,很明显它们不等同于文字''and 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

我已经用 Perl 5.16.3 和 Perl 5.20.0 对此进行了测试。

PVNV 不是比简单的 IV 大得多吗?这是 Perl 用内存换取速度的例子吗?

4

2 回答 2

5

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

确实没有内存问题,因为它们中的每一个只有一个实例。

尤其是 false 值必须是 PVNV,因为它的字符串值''和它的数值0不能相互推导(至少不会触发警告)。

于 2014-06-06T06:52:17.440 回答
1

我相信这里的答案是肯定的,PVNV 更大,但是 Perl 只在内存中保留一份真值和一份假值,所以你不会因为有很多内存而耗尽内存脚本中的布尔值。

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

$ perl -MDevel::Peek -E 'Dump !1; Dump !!1;'  2>&1 | grep REFCNT
  REFCNT = 2147483646
  REFCNT = 2147483644
于 2014-06-06T06:46:40.530 回答