根据我目前对 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}";
我假设一个散列就像一个数组,那么为什么我不能让一个散列包含另一个呢?
根据我目前对 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 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}
创建对 hash 副本的引用%b
。您需要在此处复制,因为稍后您将其清空。
散列的散列很难在第一次得到正确的。在这种情况下
$a{1} = { %b };
...
$a{2} = { %b };
会带你去你想去的地方。
有关perldoc perllol
Perl 中二维数据结构的详细信息,请参阅 。
简短的回答:散列键只能与标量相关联,而不是散列。要做你想做的事,你需要使用引用。
与其重新散列(呵呵)如何创建多级数据结构,我建议你阅读 perlreftut。perlref 更完整,但一开始有点不知所措。
迈克,亚历山大的答案是正确的。
也是一个小费。如果你只是在学习哈希,perl 有一个名为 Data::Dumper 的模块,它可以为你漂亮地打印你的数据结构,当你想检查你的数据结构有什么值时,这真的很方便。
use Data::Dumper;
print Dumper(\%a);
当你打印它时,它会显示
$VAR1 = {
'1' => {
'str' => 'hello'
},
'2' => {
'str' => 'world'
}
};
Perl 喜欢扁平化你的数据结构。这通常是一件好事......例如,(@options, "another option", "yet another")
最终成为一个列表。
如果您真的想将一个结构包含在另一个结构中,则内部结构需要作为参考。像这样:
%a{1} = { %b };
大括号表示一个散列,您使用来自 %b 的值填充它,并作为参考而不是直接散列返回。
你也可以说
$a{1} = \%b;
但这也会使 %b 更改 $a{1} 。