perl – 标志’pIOK`是什么意思?
当使用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
UPD Why private and public flags are differ 解决方法
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" CUR = 7 LEN = 10 COW_REFCNT = 1 Perl v5.16之前用于使用该标志来指示“魔术”变量(例如绑定值),因为IV字段中的值无法直接使用.这在v5.18及更高版本中已经改变,而魔术值现在使用pIOK的方式与任何其他值相同 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |