所有引用都存在于标量中吗?甚至是明确的?

时间:2014-01-01 20:21:32

标签: 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)在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

2 个答案:

答案 0 :(得分:3)

是的,引用始终是标量。

构造{ ... }创建一个空哈希,然后返回对它的引用,这是一个标量。

do { my %anon = ( ... ); \%anon }类似。

答案 1 :(得分:3)

Perl中的每种数据类型都有一个共同的“标题”数据,用于提供引用计数等。此标题中的标志确定它实际是什么类型(例如PVHV)。所以内部%hashPVHV。标题后跟其他特定于散列的字段。

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

您只能将标量传递给Perl子例程,因此您只能将哈希引用,而不是哈希本身传递给Dump。当Dump打印出你提供的任何标量时,也会显示封闭的引用。

为了更好地理解Perl中的内部数据类型,我建议使用Illustrated Perl Guts