当Devel::Peek我倾倒perl SV时,我可以看到:
SV = IV(0x1c13168) at 0x1c13178
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2
Run Code Online (Sandbox Code Playgroud)
但找不到描述是什么pIOK意思.
我想看看它在Devel::Peek,perlapi,perlguts,perlxs...在来源,我发现:
{SVp_IOK, "pIOK,"}
Run Code Online (Sandbox Code Playgroud)
但还是找不到什么SVp_IOK.它是什么?
UPD
我找到了这个文件.它揭示了旗帜的含义以及它们所处的位置.(要小心这个DOC已经过时了)
此标志指示对象具有有效的非公共IVX字段值.它只能为值类型SvIV或其子类型设置.
UPD
pIOK是如何Devel::Peek表示对应于位掩码的位SVp_IOK.的p指示"私人"标志,并且其形成了"公共"标志的一对IOK(位掩码SVf_IOK)
私有标志的确切含义在perl版本中已经改变,但一般而言,它们意味着IV(NV或者PV)字段SV在某种程度上是"不准确的"
其中,最常见的情况pIOK是在其自己的一套(pIOK总是被设置如果IOK设置)是其中PV已经转换为数字NV值.的NV和IV字段都填充,但是如果IV值不是数的精确表示(即,它已经被截断)然后pIOK被设置但IOK被清除
此代码显示了达到该状态的方法.变量$pi_str设置为π 的字符串值,并通过添加0.0并将其存储到转换为浮点值$pi_num.Devel::Peek现在显示NOK/pNOK和POK/pPOK被设置,但只有pIOK同时IOK保持清晰.看看这个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;
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Perl v5.16和之前用于使用该标志来指示"魔术"变量(例如绑定值),因为该IV字段中的值无法直接使用.这在v5.18及更高版本中已更改,并且魔术值现在pIOK以与任何其他值相同的方式使用