标志'pIOK`是什么意思?

Eug*_*kov 5 perl xs perlapi

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

为什么私人和公共旗帜不同

Bor*_*din 7

pIOK是如何Devel::Peek表示对应于位掩码的位SVp_IOK.的p指示"私人"标志,并且其形成了"公共"标志的一对IOK(位掩码SVf_IOK)

私有标志的确切含义在perl版本中已经改变,但一般而言,它们意味着IV(NV或者PV)字段SV在某种程度上是"不准确的"

其中,最常见的情况pIOK是在其自己的一套(pIOK总是被设置如果IOK设置)是其中PV已经转换为数字NV值.的NVIV字段都填充,但是如果IV值不是数的精确表示(即,它已经被截断)然后pIOK被设置但IOK被清除

此代码显示了达到该状态的方法.变量$pi_str设置为π 的字符串值,并通过添加0.0并将其存储到转换为浮点值$pi_num.Devel::Peek现在显示NOK/pNOKPOK/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以与任何其他值相同的方式使用