如何在Perl中将哈希插入哈希

时间:2011-09-22 08:41:09

标签: perl hash

我在主文件的某处定义了一个简单的哈希

our %translations = (
    "phrase 1" => "translation 1",
    # ... and so on 
    );

在另一个文件中,我想添加更多翻译。也就是说,我想做这样的事情:

push our %translations, (
    "phrase N" => "blah-blah",
    # ....
    "phrase M" => "something",
    );

当然这段代码不起作用:push不适用于哈希。所以我的问题是:将一个值的哈希值插入到现有哈希中的简单而优雅的方法是什么?

我不想诉诸

$translations{"phrase N"} = "blah-blah";
# ....
$translations{"phrase M"} = "something";

因为在Perl中你应该能够在你的代码中没有太多重复的情况下做事......

5 个答案:

答案 0 :(得分:16)

%translations = (%translations, %new_translations);

答案 1 :(得分:9)

您可以使用keysvalues函数分配哈希切片。只要在调用之间未修改哈希值,keys将按照values返回值的相同顺序返回键。

our %translations = (
  "phrase 1" => "translation 1",
);

{ # Braces just to restrict scope of %add
  my %add = (
    "phrase N" => "blah-blah",
    "phrase M" => "something",
  );
  @translations{keys %add} = values %add;
}

# Or, using your alternate syntax:
@translations{keys %$_} = values %$_ for {
  "phrase N" => "blah-blah",
  "phrase M" => "something",
};

答案 2 :(得分:6)

您可以分配给哈希切片:

@translations{@keys} = @values;

或使用其他哈希的数据:

@translations{keys %new} = values %new;

答案 3 :(得分:4)

%translations = (
    "phrase N" => "blah-blah",
    # ....
    "phrase M" => "something",
    %translations
    );

答案 4 :(得分:2)

Hash::Merge是另一种选择:https://metacpan.org/module/Hash::Merge

也 - 不要过于担心复制哈希的优化 - 如果它成为一个问题,那么请查看它。首先尝试编写清晰可读且可维护的代码。带字符串值的数千个键的哈希值不大!

你的问题中没有指明的是,是否会发生任何密钥冲突(即,是否有两个'从文件中读取的短语1?'