在Perl中向匿名哈希添加多个键

在Perl中向匿名哈希添加多个键,perl,hash,Perl,Hash,我有一个散列,它为每个记录保存一个匿名散列,包含两个元素:一个数组和一个散列。我想用一个键列表初始化这个子散列 我知道当您使用普通散列(而不是ref)并同时使用键列表和值列表时,可以使用散列切片 我的代码是这样的 my %records; my $key = "key1"; my @states = ( "state1", "state2", "state3" ); $records{$key} = { numbers => [], states => %{@st

我有一个散列,它为每个记录保存一个匿名散列,包含两个元素:一个数组和一个散列。我想用一个键列表初始化这个子散列

我知道当您使用普通散列(而不是ref)并同时使用键列表和值列表时,可以使用散列切片

我的代码是这样的

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}
。我可以发誓以前有人问过这个问题,但我能找到的最接近的答案并不总是越短越好。一般来说,你应该力求可读而不是简洁。你应该展示你想要的
%记录的样子。令人费解的是,您只有散列的键,而没有值