如何申报AoHoAoH?

时间:2011-02-07 13:48:29

标签: arrays perl hash perl-data-structures

我有Dumper

的输出
'group' => {
             '1104' => {
                         'a' => 1
                       },
             '52202' => {
                          'b' => 1,
                          'c' => 1
                        },
             '52201' => {
                          'c' => 1
                        },
             '52200' => {
                          'c' => 1
                        }
           },

我假设是哈希数组哈希数组?

我想宣布这个结构是我自己的。

有没有办法做到这一点,所以下次我看到这么复杂的结构时,我可以立刻做到这一点? =)

2 个答案:

答案 0 :(得分:11)

您的输出是哈希散列的哈希值,第一个哈希值只包含一个元素。 {}标记了哈希引用,因此您将重复数据结构,结果$hohoh是对HoHoH的引用。

my $hohoh = {
    'group' => {
         '1104' => {
                     'a' => 1
                   },
         '52202' => {
                      'b' => 1,
                      'c' => 1
                    },
         '52201' => {
                      'c' => 1
                    },
         '52200' => {
                      'c' => 1
                    }
       },
};
print $hohoh->{group}{1104}{a}; # -> 1

我建议您阅读Perl Datastructures Cookbook

答案 1 :(得分:2)

由于变量和散列值的类型可以在Perl中更改,因此没有任何方法可以按照您可能想到的方式“声明”三级散列。您可以在创建每个密钥时将空hashref实例化,这是一个类似的想法:

# First pass
my $data = {};

# Later...
$data->{group} = {};

# Still later...
$data->{group}->{1104} = {};

# Finally... 
$data->{group}->{1104}->{a} = 1;

但是,您可以轻松地在获取数据时简单地填写数据,从而允许自动进行操作:

my $data;

# Fill one piece of data... Perl creates all three hash levels now.
$data->{group}->{1104}->{a} = 1; 

# Fill another piece of data, this one has two values in the "bottom" hash.
$data->{group}->{52202} = { b => 1, c => 2};

但是没有办法(在普通的Perl中)“强制”任何特定键的值包含哈希而不是字符串或子例程引用,这通常是具有类C类型系统的语言中声明的意图。