8

根据我目前对 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}"; 

我假设一个散列就像一个数组,那么为什么我不能让一个散列包含另一个呢?

4

5 回答 5

6
  1. 您应该始终使用“使用严格;” 在你的程序中。

  2. 使用引用和匿名哈希。

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。您需要在此处复制,因为稍后您将其清空。

于 2010-05-25T21:29:28.720 回答
6

散列的散列很难在第一次得到正确的。在这种情况下

$a{1} = { %b };
...
$a{2} = { %b };

会带你去你想去的地方。

有关perldoc perllolPerl 中二维数据结构的详细信息,请参阅 。

于 2010-05-25T21:29:32.713 回答
4

简短的回答:散列键只能与标量相关联,而不是散列。要做你想做的事,你需要使用引用。

与其重新散列(呵呵)如何创建多级数据结构,我建议你阅读 perlreftut。perlref 更完整,但一开始有点不知所措。

于 2010-05-25T21:50:26.643 回答
2

迈克,亚历山大的答案是正确的。

也是一个小费。如果你只是在学习哈希,perl 有一个名为 Data::Dumper 的模块,它可以为你漂亮地打印你的数据结构,当你想检查你的数据结构有什么值时,这真的很方便。

use Data::Dumper;
print Dumper(\%a); 

当你打印它时,它会显示

$VAR1 = {
          '1' => {
                   'str' => 'hello'
                 },
          '2' => {
                   'str' => 'world'
                 }
        };
于 2010-05-25T21:44:57.747 回答
1

Perl 喜欢扁平化你的数据结构。这通常是一件好事......例如,(@options, "another option", "yet another")最终成为一个列表。

如果您真的想将一个结构包含在另一个结构中,则内部结构需要作为参考。像这样:

%a{1} = { %b };  

大括号表示一个散列,您使用来自 %b 的值填充它,并作为参考而不是直接散列返回。

你也可以说

$a{1} = \%b;   

但这也会使 %b 更改 $a{1} 。

于 2010-05-25T21:38:08.210 回答