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

前端之家收集整理的这篇文章主要介绍了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
我找到了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"\0
  CUR = 7
  LEN = 10
  COW_REFCNT = 1

Perl v5.16之前用于使用该标志来指示“魔术”变量(例如绑定值),因为IV字段中的值无法直接使用.这在v5.18及更高版本中已经改变,而魔术值现在使用pIOK的方式与任何其他值相同

猜你在找的Perl相关文章