Как я создаю хеш хешей в Perl?

На основе моего текущего понимания хешей в Perl я ожидал бы, что этот код распечатает "привет мир". Это вместо этого ничего не печатает.

%a=();

%b=();
$b{str} = "hello";  
$a{1}=%b;

$b=();
$b{str} = "world";
$a{2}=%b;

print "$a{1}{str}  $a{2}{str}"; 

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

7
задан Axeman 8 October 2010 в 21:27
поделиться

5 ответов

  1. Вы всегда должны использовать "use strict;" в своей программе.

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

6
ответ дан 6 December 2019 в 09:58
поделиться

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

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

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

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

6
ответ дан 6 December 2019 в 09:58
поделиться

Mike, Alexandr's is the right answer.

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

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

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

$VAR1 = {
          '1' => {
                   'str' => 'hello'
                 },
          '2' => {
                   'str' => 'world'
                 }
        };
2
ответ дан 6 December 2019 в 09:58
поделиться

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

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

4
ответ дан 6 December 2019 в 09:58
поделиться

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

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

%a{1} = { %b };  

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

Можно также сказать

$a{1} = \%b;   

но тогда изменения в %b изменят и $a{1}.

1
ответ дан 6 December 2019 в 09:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: