例如:
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
答案 0 :(得分:3)
是的,引用始终是标量。
构造{ ... }
创建一个空哈希,然后返回对它的引用,这是一个标量。
与do { my %anon = ( ... ); \%anon }
类似。
答案 1 :(得分:3)
Perl中的每种数据类型都有一个共同的“标题”数据,用于提供引用计数等。此标题中的标志确定它实际是什么类型(例如PVHV
)。所以内部%hash
是PVHV
。标题后跟其他特定于散列的字段。
现在什么是$reference = \%hash
?引用是包含指向另一种数据类型的指针的标量。这是作为IV
中的整数字段实现的,但ROK
标志设置为显示数据不是整数而是指针。
您只能将标量传递给Perl子例程,因此您只能将哈希引用,而不是哈希本身传递给Dump
。当Dump
打印出你提供的任何标量时,也会显示封闭的引用。
为了更好地理解Perl中的内部数据类型,我建议使用Illustrated Perl Guts。