在哈希中存储哈希

问题描述:

我遇到了Perl脚本的麻烦。我尝试在散列中存储散列。该脚本很简单:在哈希中存储哈希

use Data::Dumper; 

my %h1=(); 
$h1{name}="parent"; 
my %h2=(); 
$h2{name}="child"; 

$h1{nested}=%h2; # store hash h2 in hash h1 

print "h2:\n"; 
print Dumper(%h2); # works 
print "h1{nested}:\n"; 
print Dumper($h1{nested}); # fails 

结果:

h2: 
$VAR1 = 'name'; 
$VAR2 = 'child'; 
h1{nested}: 
$VAR1 = '1/8'; 

为什么$ {H1}嵌套甩不作为哈希,但由于某种奇怪的标量(1/8)的?

PS:即使这个问题听起来微不足道 - 我搜索了但没有发现它之前被问过。 PPS:我Perl是专为v5.10.1(*)x86_64的Linux的GNU的线程多 (53个注册补丁,看到的perl-V的更详细)

+0

感谢大家的好评! – cruppstahl

只能存储一个hashref在哈希:

$h1{nested}=\%h2; 

,然后你会做

$h1{nested}->{name} 

在你的代码中访问%h2的名字,%H2被强制标量上下文,这表明你是‘1/8’价值和存储那个。

+2

或'$ h1 {nested} {name}';请参阅http://perlmonks.org/?node=References+quick+reference – ysth

在perl中存储在列表中的值(散列或数组)是总是标量。鉴于此,将哈希存储在另一个哈希中的唯一方法是存储对其的引用。

$h1{'nested'} = \%h2; 

,或者也

$h1{'nested'} = { 'name'=>'child' }; 

(在右手侧上的支架是一个匿名散列的引用)。

BTW,不引用文本中的键通常被认为是不好的做法,看到here

为什么$ H1 {嵌套}不甩作为哈希,但由于某种奇怪的标量( 1/8)?

因为您将其存储在标量上下文中!

当你这样做:

$h1{nested} = %h2; 

你存储一个标量。由于%h2是一个散列,因此给出了ol'分数字符串。按照Perldoc website

如果你评估在标量上下文的哈希,它返回如果哈希为空,假的。如果有任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的存储段数和分配的存储段数组成,并由斜杠分隔。

这解释了你所得到的1/8

你需要做的是将散列作为参考存储在另一个散列中。正如其他人指出的那样,它应该是:

$h1{nested} = \%h2; 

散列名之前的反斜杠为您提供散列存储位置。你可以使用花括号,但我更喜欢反斜杠符号。

请在您的计算机上(或我已链接到的网页上)查看perldoc prelreftut。这将告诉你如何制作列表,散列或散列列表,散列列表和散列列表等。只是一个word o`警告:如果你太复杂了,这将很难保持,所以一旦你玩得开心,看看perldoc's Perl Object Orientation Programming Tutorial

perldoc命令包含许多Perl文档,包括所有Perl函数,系统上安装的Perl模块,甚至包含有关Perl语言的基本信息。