【问题标题】:Add multiple keys to an anonymous hash in Perl在 Perl 中向匿名哈希添加多个键
【发布时间】:2015-08-28 20:39:15
【问题描述】:

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

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

我的代码是这样的

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

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

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

【问题讨论】:

  • 切片很酷,但您不必在任何地方都使用它们。就做my $states = { ... }; $records{$key} = { states => $states };
  • states => { map { $_ => undef } @states }
  • 我可以发誓以前有人问过这个问题,但我能找到的最接近的是Anonymous Hash Slices - syntax?
  • 越短并不总是越好。一般来说,你应该追求可读性而不是简洁。
  • 您应该展示您希望%records 的外观。令人费解的是,您只有哈希键而没有值

标签: perl hash


【解决方案1】:

令人费解的是,您的哈希只有键而没有值。这段代码会将$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  => {},
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多