perl - 所有引用都以标量形式存在吗?甚至是明确的?

标签 perl perlguts

例如:

use strict;
use warnings;
use Devel::Peek;

Dump({});

将打印以下内容:

SV = IV(0x170fc98) at 0x170fca8
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x170fa68
  SV = PVHV(0x1715970) at 0x170fa68
    REFCNT = 1
    FLAGS = (SHAREKEYS)
    ARRAY = 0x0
    KEYS = 0
    FILL = 0
    MAX = 7
    RITER = -1
    EITER = 0x0

似乎SV = IV(0x170fc98) at 0x170fca8(一个数字,IV,标量)引用了PVHV(散列)< strong>SV = PVHV(0x1715970) 在 0x170fa68

我期待的是这样的:

  SV = PVHV(0x1715970) at 0x170fa68
    REFCNT = 1
    FLAGS = (SHAREKEYS)
    ARRAY = 0x0
    KEYS = 0
    FILL = 0
    MAX = 7
    RITER = -1
    EITER = 0x0

最佳答案

Perl 中的每种数据类型都有一个通用的数据“头”,提供引用计数等。此头中的标志决定了它实际是什么类型(例如 PVHV)。所以在内部 %hash 是一个 PVHV。 header 后跟其他特定于哈希的字段。

现在什么是$reference =\%hash?引用是包含指向另一种数据类型的指针的标量。这是作为 IV 中的整数字段实现的,但是 ROK 标志被设置为表明数据不是整数而是指针。

您只能将标量传递给 Perl 子例程,因此您只能传递一个散列引用,而不能将散列本身传递给 Dump。当 Dump 打印出您提供的任何标量时,还会显示封闭的引用。

为了更好地理解 Perl 中的内部数据类型,我推荐 Illustrated Perl Guts .

关于perl - 所有引用都以标量形式存在吗?甚至是明确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872857/

相关文章:

珀尔;如何按值过滤哈希(指定条件)

multithreading - 线程中的 Perl getstore

perl - 如何在 Perl 脚本之间共享 ENV 变量

perl - 了解 newRV_inc 与 newRV_noinc

windows - 为什么 Perl 应用程序 'prove' 并行启动我的脚本但不并行执行这些脚本中的测试用例?

perl - 为什么$ ARGV [0]没有通过我传递给这个perl一个衬里​​的文件名进行初始化?

perl - mro、goto 和 set_subname 如何交互?

perl - 为什么 Perl 的规范 "true"和 "false"值在内部是 PVNV?

ruby - 是否有像 perlguts/illguts for ruby​​ 这样的文档?