使用数组引用值动态创建散列的散列
Dynamically create hash of hash with array ref values
我想动态创建一个结构如下:
{
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;
但不知何故我不确定如何才能正确地做到这一点,而且语法似乎非常复杂。
我怎样才能以 nice/clear 的方式实现我想要的?
你给自己添了不少麻烦。 Perl 有 autovivication 这意味着如果你使用它们就像它们包含数据引用一样,它会神奇地为你创建任何必要的散列或数组元素
你的线路
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"] } }
我想动态创建一个结构如下:
{
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;
但不知何故我不确定如何才能正确地做到这一点,而且语法似乎非常复杂。
我怎样才能以 nice/clear 的方式实现我想要的?
你给自己添了不少麻烦。 Perl 有 autovivication 这意味着如果你使用它们就像它们包含数据引用一样,它会神奇地为你创建任何必要的散列或数组元素
你的线路
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"] } }