gpt4 book ai didi

perl - 标志 `pIOK` 是什么意思?

转载 作者:行者123 更新时间:2023-12-02 01:24:26 28 4
gpt4 key购买 nike

当使用 Devel::Peek 转储 perl SV 时,我可以看到:

SV = IV(0x1c13168) at 0x1c13178
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2

但找不到pIOK含义的描述。

我尝试查看 Devel::Peekperlapiperlgutsperlxs ...在来源中我发现:

{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

最佳答案

pIOKDevel::Peek 表示与位掩码 SVp_IOK 对应的位的方式。 p 表示“私有(private)”标志,它与“公共(public)”标志 IOK(位掩码 SVf_IOK)形成一对

私有(private)标志的确切含义在 Perl 版本中发生了变化,但一般而言,它们意味着 IV (或 NVPV) >) SV 字段在某种程度上“不准确”

pIOK 单独设置的最常见情况(如果设置了 IOK,则 pIOK 始终被设置)是 >PV 已转换为数字 NV 值。 NVIV 字段均已填充,但如果 IV 值不是数字的准确表示(即它已被截断) ) 然后 pIOK 被设置,但 IOK 被清除

此代码显示了达到该状态的方法。变量 $pi_str 设置为 π 的字符串值,并通过添加 0.0 将其转换为浮点值并将其存储到 $pi_numDevel::Peek 现在显示 NOK/pNOKPOK/pPOK设置,但仅 pIOKIOK 保持清晰。查看 IV 值我们可以明白原因:它被设置为 3,这是 int $pi_str 的缓存值,以防我们再次需要它,但它是 < em>不是整数形式的字符串“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 及之前版本使用该标志来指示“神奇”变量(例如绑定(bind)值),因为 IV 字段中的值无法被直接使用。这在 v5.18 及更高版本中发生了变化,魔术值现在以与任何其他值相同的方式使用 pIOK

关于perl - 标志 `pIOK` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48277764/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com