为什么Perl的规范"真实"和"虚假"价值PVNV内部?

Kao*_*oru 3 perl perlguts

Perl有一个规范的"真"和"假"值,它用于布尔否定的情况用!not.

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

print Dumper !1;    # outputs $VAR1 = '';
print Dumper !!1;   # outputs $VAR1 = 1;
Run Code Online (Sandbox Code Playgroud)

到目前为止都很好.

但是,当我看值与Devel::Peek很显然,他们并不等同于字面''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
Run Code Online (Sandbox Code Playgroud)

我用Perl 5.16.3和Perl 5.20.0对此进行了测试.

PVNV不是比简单的IV大得多吗?这是Perl交易记忆的速度吗?

yst*_*sth 5

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

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

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