Как объявить AoHoAoH? - PullRequest
       6

Как объявить AoHoAoH?

0 голосов
/ 07 февраля 2011

У меня есть этот вывод из Dumper

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

который я предполагаю, это Массив Хэшей Массивов Хэшей?

Я хотел бы объявить эту структуру своей личностью.

Есть ли способ сделать это, поэтому в следующий раз, когда я увижу такую ​​сложную структуру, я смогу сделать это в кратчайшие сроки? =)

Ответы [ 2 ]

11 голосов
/ 07 февраля 2011

Ваш вывод представляет собой хеш хешей, причем первый хеш содержит только один элемент.{} помечает ссылку на хэш, поэтому вы будете повторять свою структуру данных таким образом, где результирующее $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Поваренная книга .

2 голосов
/ 07 февраля 2011

Поскольку типы переменных и значений хеш-функции могут изменяться в Perl, нет никакого способа "объявить" трехуровневый хеш-код, как вы, вероятно, думаете.Вы можете создать пустой хеш-адрес в каждом ключе по мере его создания, что аналогично:

# 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.

...