当使用Devel :: Peek转储perl SV时,我可以看到:
SV = IV(0x1c13168) at 0x1c13178 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2
但找不到pIOK的含义.
我试着看看Devel :: Peek,perlapi,perlguts,perlxs ……
在消息来源中我发现:
{SVp_IOK,"pIOK,"}
但还是找不到什么是SVp_IOK.它是什么?
UPD
我找到了this document.它略微标明了旗帜的含义以及它们所处的位置. (要小心这个DOC已经过时了)
This flag indicates that the object has a valid non-public IVX field value. It can only be set for value type SvIV or subtypes of it.
UPD
解决方法
pIOK是Devel :: Peek如何表示与位掩码SVp_IOK对应的位. p表示“私有”标志,它与“公共”标志IOK(位掩码SVf_IOK)形成一对
私有标志的确切含义在perl版本中已经改变,但一般而言,它们意味着SV的IV(或NV或PV)字段在某种程度上是“不准确的”
pIOK自行设置的最常见情况(如果设置了IOK,则始终设置pIOK)是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;
产量
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的方式与任何其他值相同