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

时间:2015-08-28 20:39:16

标签: perl hash

我有一个哈希,为每个记录保存一个带有2个元素的匿名哈希:一个数组和一个哈希。我想用一个键列表初始化这个辅助哈希。

我知道当你使用普通哈希(不是ref)并同时使用键列表和值列表时,可以使用哈希切片。

我的代码就像这样

my %records;
my $key = "key1";
my @states = ( "state1", "state2", "state3" );

$records{$key} = {
    numbers => [],
    states  => %{@states} #This is wrong !
};

编辑(标记为重复):此问题询问如何向匿名哈希添加多个键。

1 个答案:

答案 0 :(得分:3)

令人费解的是,您只有哈希的密钥而没有值。此代码会将$records{$key}{states}的每个元素的值设置为undef

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  => {},
}