在Perl中向匿名哈希添加多个键
我有一个散列,它为每个记录保存一个匿名散列,包含两个元素:一个数组和一个散列。我想用一个键列表初始化这个子散列 我知道当您使用普通散列(而不是ref)并同时使用键列表和值列表时,可以使用散列切片 我的代码是这样的在Perl中向匿名哈希添加多个键,perl,hash,Perl,Hash,我有一个散列,它为每个记录保存一个匿名散列,包含两个元素:一个数组和一个散列。我想用一个键列表初始化这个子散列 我知道当您使用普通散列(而不是ref)并同时使用键列表和值列表时,可以使用散列切片 我的代码是这样的 my %records; my $key = "key1"; my @states = ( "state1", "state2", "state3" ); $records{$key} = { numbers => [], states => %{@st
my %records;
my $key = "key1";
my @states = ( "state1", "state2", "state3" );
$records{$key} = {
numbers => [],
states => %{@states} #This is wrong !
};
编辑(标记为重复):此问题询问如何向匿名哈希添加多个键 令人费解的是,您只有哈希键,没有值。此代码将
$records{$key}{states}
的每个元素的值设置为unde
my %records;
my $key = "key1";
my @states = ( "state1", "state2", "state3" );
$records{$key} = {
numbers => [],
states => { map { ( $_ => undef ) } @states },
};
但是,暂时构建一个适当的散列并将其引用分配给数据结构会更清楚。我将整个赋值过程封装在它自己的块中,这样我就可以声明一个临时的词法散列%states
{
my %states;
@states{@states} = ();
$records{$key} = {
numbers => [],
states => \%states,
};
}
但请注意,如果散列元素根本不存在,通常比使用未定义的值创建它们要好。没有必要像这样预先分配散列的元素,只需像处理数组一样将其留空即可
$records{$key} = {
numbers => [],
states => {},
}
切片很酷,但你不必到处使用。只要做
my$states={…}$记录{$key}={states=>$states}
或states=>{map{$\u=>unde}@states}
。我可以发誓以前有人问过这个问题,但我能找到的最接近的答案并不总是越短越好。一般来说,你应该力求可读而不是简洁。你应该展示你想要的%记录的样子。令人费解的是,您只有散列的键,而没有值