0

我有这个输出Dumper

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

我假设是一个哈希数组的哈希数组?

我想自己声明这个结构。

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

4

2 回答 2

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

于 2011-02-07T13:52:50.397 回答
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 类型系统的语言中声明的意图。

于 2011-02-07T14:26:49.137 回答