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