pIOK
是如何Devel::Peek
表示与位掩码对应的位SVp_IOK
。表示“p
私有”标志,它与“公共”标志IOK
(位掩码SVf_IOK
)形成一对
私有标志的确切含义在 perl 版本中有所不同,但一般来说,它们意味着 的IV
(或NV
或PV
)字段SV
在某些方面是“不准确的”
pIOK
单独设置的最常见情况(如果设置,pIOK
则始终IOK
设置)是 aPV
已转换为数值NV
。和字段均已填充,但如果该NV
值不是数字的准确表示(即已被截断),则设置但被清除IV
IV
pIOK
IOK
此代码显示了达到该状态的方法。变量$pi_str
设置为 π 的字符串值,并通过添加 0.0 将其转换为浮点值并将其存储到$pi_num
. Devel::Peek
现在显示NOK/pNOK
and POK/pPOK
are set,但只有pIOK
whileIOK
仍然清晰。查看该IV
值我们可以看出原因:它设置为 3,这是缓存的值,int $pi_str
以防我们再次需要它,但它不是"3.14159"
整数形式的字符串的准确表示
use strict;
use warnings 'all';
use Devel::Peek 'Dump';
my $pi_str = "3.14159";
my $pi_num = $pi_str + 0.0;
Dump $pi_str;
输出
SV = PVNV(0x28fba68) at 0x3f30d30
REFCNT = 1
FLAGS = (NOK,POK,IsCOW,pIOK,pNOK,pPOK)
IV = 3
NV = 3.14159
PV = 0x3fb7ab8 "3.14159"\0
CUR = 7
LEN = 10
COW_REFCNT = 1
Perl v5.16 及之前使用标志来指示“魔术”变量(例如绑定值),因为IV
字段中的值不能直接使用。这在 v5.18 及更高版本中进行了更改,现在魔法值pIOK
的使用方式与任何其他值相同