Как создать хэш хэшей в 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 ответов


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

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

{%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}.