在哈希中存储哈希
我遇到了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的更详细)
只能存储一个hashref在哈希:
$h1{nested}=\%h2;
,然后你会做
$h1{nested}->{name}
在你的代码中访问%h2
的名字,%H2被强制标量上下文,这表明你是‘1/8’价值和存储那个。
或'$ 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语言的基本信息。
感谢大家的好评! – cruppstahl