Как мне создать хэш хэшей в Perl? - PullRequest
7 голосов
/ 26 мая 2010

Исходя из моего нынешнего понимания хэшей в 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}"; 

Я предполагаю, что хеш похож на массив, так почему я не могу сделать хеш, содержащий другой?

Ответы [ 5 ]

6 голосов
/ 26 мая 2010

Хеши хешей сложно получить правильно с первого раза. В этом случае

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

доставит вас туда, куда вы хотите.

См. perldoc perllol для подробностей о двумерных структурах данных в Perl.

6 голосов
/ 26 мая 2010
  1. Вы всегда должны использовать «используйте строгий;» в вашей программе.

  2. Использовать ссылки и анонимные хеши.

</p> <pre><code>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} создает ссылку на копию хэша %b. Вам нужно скопировать сюда, потому что вы опустошите его позже.

4 голосов
/ 26 мая 2010

Краткий ответ: хеш-ключи могут быть связаны только со скаляром, а не хеш-кодом. Чтобы делать то, что вы хотите, вам нужно использовать ссылки.

Вместо повторного хеширования (хех) создания многоуровневых структур данных, я предлагаю вам прочитать perlreftut. Perlref более полный, но сначала он немного ошеломляющий.

2 голосов
/ 26 мая 2010

Майк, Александр - правильный ответ.

Также совет. Если вы только изучаете хэши, в Perl есть модуль Data :: Dumper, который может красиво распечатать ваши структуры данных для вас, что очень удобно, когда вы хотите проверить, какие значения имеют ваши структуры данных.

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

когда вы печатаете это, он показывает

$VAR1 = {
          '1' => {
                   'str' => 'hello'
                 },
          '2' => {
                   'str' => 'world'
                 }
        };
1 голос
/ 26 мая 2010

Perl любит выравнивать ваши структуры данных. Часто это хорошо ... например, (@options, "another option", "yet another") заканчивается одним списком.

Если вы действительно хотите иметь одну структуру внутри другой, внутренняя структура должна быть ссылкой. Вот так:

%a{1} = { %b };  

Фигурные скобки обозначают хеш, который вы заполняете значениями из% b, и возвращаете его как ссылку, а не прямой хеш.

Вы также можете сказать

$a{1} = \%b;   

но это также приводит к изменению% b и $ a {1}.

...