2011-09-22 37 views
11

我在主文件如何插入到哈希散列在Perl

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

在另一个文件中我想添加一些更多的翻译某处定义了一个简单的散列。也就是说,我想做的事情是这样的:

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

当然这个代码是行不通的:push不哈希工作。所以我的问题是:什么是一个简单而优雅的方式来插入值的散列到现有的散列?

我不想因为在Perl中你应该能够做的事情没有在你的代码太多的重复诉诸

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

...

回答

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

这有助于!我甚至可以把它写成'@translations {键%$ _} = $值_%为{ “这句话N”=> “夸夸其谈”,...};' – Pasha

+1

这句法并没有出现我,但它是一个聪明的捷径。循环使得它可能是一个效率较低的头发,但我怀疑这种差异是可以衡量的。 – cjm

+0

好吧,它是一个单一元素的循环。将匿名散列分配给$ _变量的更方便的方法。 – Pasha

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

这是否将整个哈希结束了吗?也就是说,假设'%translations'包含数千个条目了。你愿意解决方案创建一个临时散(“这句话N” => ...,“短语M” => ... <的原件及复印件%译文>),然后这个临时哈希分配到%的翻译。如果这样的话就会出现使用这种方法的显著的开销,如果不是那么它似乎很简单 – Pasha

+0

@ user958624:?!是的,它一个新的列表价值是从这些子列表中构造出来的,并被分配给'%翻译' –

6

你可以分配给一个散列切片:

@translations{@keys} = @values; 

或使用来自另一散列数据:

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

但是,由于我添加了许多新密钥,因此将很难保留追踪键与它们的值之间的对应关系(哪个翻译对应于哪个词组)。 – Pasha

+0

@ user958624:您可以使用键和值(见更新) –

15
%translations = (%translations, %new_translations); 
+0

相同的原则,yi_H的回答阵列,而是表明你可以做到这一点在现有的哈希值,而不是仅仅在创建'%translations' – plusplus

2

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

也 - 不要太担心在复制优化哈希 - 如果它成为一个问题,看看它,然后。首先尝试编写清晰易读的可维护代码。几千个键与字符串值的哈希值不大!

你有没有在你的问题中指明的是,是否会出现按键的任何碰撞(即可能我会有两个“乐句1的从文件中读取...?

+0

除非你有嵌套的数据结构或需要对重复键进行特殊处理,否则Hash :: Merge是过度杀伤的。 – cjm

+1

我同意,这是在这种情况下,但知道存在的有用,所以我想我只是提到它。 – plusplus