加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 标志’pIOK`是什么意思?

发布时间:2020-12-16 06:19:51 所属栏目:大数据 来源:网络整理
导读:当使用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,"} 但还是找不到
当使用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已经过时了)

enter image description here

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

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的方式与任何其他值相同

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读