Динамически создавать хэш хэша со значениями ссылки на массив

Я хочу динамически создать структуру следующим образом:

{  
   edition1 => {  
                 Jim => ["title1", "title2"],  
                 John => ["title3", "title4"],  
              },  
  edition2 => { 
                 Jim => ["titleX",],  
                 John => ["titleY,],  
              }  etc
}  

Я запутался в том, как я это делаю.
В основном я думаю с точки зрения:

my $edition = "edition1";  
my $author = "Jim";  
my $title = "title1";  
my %main_hash = ();  

${$main_hash{$edition}} ||= {};   

${$main_hash{$edition}}->{$author} ||= [];     

push @{{$main_hash{$edition}}->{$author}} , $title;   

Но почему-то я не уверен, как я могу сделать это правильно, и синтаксис кажется очень сложным.
Как я могу достичь того, что я хочу, в хорошей / четкой манере?

1 ответ

Решение

Вы сделали это довольно сложно для себя. В Perl есть автовификация, что означает, что он волшебным образом создаст для вас все необходимые элементы хеша или массива, если вы будете использовать их так, как если бы они содержали ссылки на данные.

Ваша линия

push @{{$main_hash{$edition}}->{$author}} , $title;

ближе всего вы пришли, но у вас есть дополнительная пара скобок вокруг $main_hash{$edition} который пытается создать анонимный хеш с $main_hash{$edition} как его единственный ключ и undef в качестве значения. Вам также не нужно использовать стрелку косвенного действия между закрывающими и открывающими скобками или скобками

Эта программа показывает, как использовать возможности Perl, чтобы написать это более кратко

use strict;
use warnings;

my %data;

my $edition = "edition1";
my $author  = "Jim";
my $title   = "title1";

push @{ $data{$edition}{$author} }, $title;

use Data::Dump;
dd \%data;

выход

{ edition1 => { Jim => ["title1"] } }
Другие вопросы по тегам