如何在Perl中创建散列?
根据我目前对Perl中哈希的理解,我希望这段代码打印“hello world”,而不是打印任何内容如何在Perl中创建散列?,perl,hash,perl-data-structures,Perl,Hash,Perl Data Structures,根据我目前对Perl中哈希的理解,我希望这段代码打印“hello world”,而不是打印任何内容 %a=(); %b=(); $b{str} = "hello"; $a{1}=%b; $b=(); $b{str} = "world"; $a{2}=%b; print "$a{1}{str} $a{2}{str}"; 我假设一个散列就像一个数组,那么为什么我不能让一个散列包含另一个呢 您应该在程序中始终使用“use strict;” 使用引用和匿名哈希 use strict;u
%a=();
%b=();
$b{str} = "hello";
$a{1}=%b;
$b=();
$b{str} = "world";
$a{2}=%b;
print "$a{1}{str} $a{2}{str}";
我假设一个散列就像一个数组,那么为什么我不能让一个散列包含另一个呢
use strict;use warnings;
my %a;
my %b;
$b{str} = "hello";
$a{1}={%b};
%b=();
$b{str} = "world";
$a{2}={%b};
print "$a{1}{str} $a{2}{str}";
{%b}
创建对哈希副本的引用%b
。您需要在此处复制,因为您稍后会清空它。哈希的哈希值很难在第一次得到正确的结果。在这种情况下
$a{1} = { %b };
...
$a{2} = { %b };
会带你去你想去的地方
有关Perl中二维数据结构的详细信息,请参阅。Perl喜欢扁平化数据结构。这通常是一件好事……例如,
(@options,“另一个选项”,“还有另一个”)
作为一个列表结束
如果你真的想让一个结构在另一个结构中,那么内部结构需要是一个引用。像这样:
%a{1} = { %b };
大括号表示一个散列,您正在用来自%b的值填充该散列,并作为引用而不是直接散列返回
你也可以说
$a{1} = \%b;
但是这也改变了%b的变化$a{1}。迈克,亚历山大的答案是正确的 这也是一个提示。如果您刚刚学习散列,perl有一个名为Data::Dumper的模块,它可以为您非常方便地打印数据结构,当您想检查数据结构的值时,它非常方便
use Data::Dumper;
print Dumper(\%a);
当你打印这个时,它会显示
$VAR1 = {
'1' => {
'str' => 'hello'
},
'2' => {
'str' => 'world'
}
};
简短回答:哈希键只能与标量关联,不能与哈希关联。要想做你想做的事,你需要使用引用
我建议您阅读perlreftut,而不是重新散列(heh)如何创建多级数据结构。perlref更完整,但一开始有点难以理解。为什么这不起作用的原因是,基本上,散列或数组只能包含标量值,而散列不是标量。但是,哈希引用是:)下面的答案有一些关于原因的好链接。谢谢!我忘了perldsc。我必须看着perlref才能记住perlreftut的存在。:-)“我认为我应该重新熟悉这些文档。@davidwall复习文档总是很好的,但特别是教程部分很容易忘记,但不能错过。我特别记得我喜欢
perlre
,perlreftut
,perldsc
,perlopentut
,perltoot
(可能这一个已经过时或与当前关于Perl中OO的最佳实践脱节-不确定)和perlstyle
@Mike:使用严格应该是标准的,这不是特例。@ether我意识到,现在我在学习Perl,刚刚发现strictperldoc perllol
一直都是数组,我想perldoc-perldsc
进入更复杂的场景(包括散列)。我还强烈建议对Perl中的引用新手使用perldoc perlreftut
。