2

例如:

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

似乎0x170fca8 处的 SV = IV(0x170fc98)(数字,IV,标量)引用了0x170fa68 处的PVHV(哈希)SV = PVHV(0x1715970)

我期待类似的东西:

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

2 回答 2

3

是的,引用总是标量。

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

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

于 2014-01-01T20:45:02.413 回答
3

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

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

您只能将标量传递给 Perl 子例程,因此您只能将哈希引用传递给Dump. 在Dump打印出您提供的任何标量时,还会显示封闭的引用。

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

于 2014-01-01T20:45:12.560 回答