На основе моего текущего понимания хешей в Perl я ожидал бы, что этот код распечатает "привет мир". Это вместо этого ничего не печатает.
%a=();
%b=();
$b{str} = "hello";
$a{1}=%b;
$b=();
$b{str} = "world";
$a{2}=%b;
print "$a{1}{str} $a{2}{str}";
Я предполагаю, что хеш точно так же, как массив, итак, почему я не могу заставить хеш содержать другого?
Вы всегда должны использовать "use strict;" в своей программе.
Используйте ссылки и анонимные хэши.
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
. Копия нужна здесь, потому что позже вы ее опустошите.
Хеши хешей сложно исправить с первого раза. В этом случае
$a{1} = { %b };
...
$a{2} = { %b };
доставит вас туда, куда вы хотите.
См. perldoc perllol
для подробностей о двумерных структурах данных в Perl.
Mike, Alexandr's is the right answer.
Также совет. Если вы только изучаете хэши, в perl есть модуль Data::Dumper, который может красиво распечатать ваши структуры данных, что очень удобно, когда вы хотите проверить, какие значения имеют ваши структуры данных.
use Data::Dumper;
print Dumper(\%a);
когда вы распечатываете это, это показывает
$VAR1 = {
'1' => {
'str' => 'hello'
},
'2' => {
'str' => 'world'
}
};
Краткий ответ: хеш-ключи могут быть связаны только со скаляром, но не с хешем. Чтобы делать то, что вы хотите, вам нужно использовать ссылки.
Вместо повторного хеширования (хех), как создавать многоуровневые структуры данных, я предлагаю вам прочитать perlreftut. perlref более полный, но поначалу немного ошеломляющий.
Perl любит уплощать структуры данных. Часто это хорошо... например, (@options, "another option", "yet another")
в итоге получается один список.
Если вы действительно хотите иметь одну структуру внутри другой, внутренняя структура должна быть ссылкой. Например, так:
%a{1} = { %b };
Скобки обозначают хэш, который вы заполняете значениями из %b и получаете обратно в виде ссылки, а не прямого хэша.
Можно также сказать
$a{1} = \%b;
но тогда изменения в %b изменят и $a{1}.