2011-09-22 2 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

これは役に立ちます!文法N "=>" blah-blah "、...}; ' – Pasha

+1

その構文は私には起こりませんでしたが、私はそれを' @translations {keys%$ _} = values $%それは賢明なショートカットです。このループにより、おそらく髪の効率が悪くなりますが、その差が測定可能であるかどうかは疑問です。 – cjm

+0

まあ、それは単一の要素のループです。 $ _変数に匿名ハッシュを割り当てる便利な方法のほうが多くあります。 – Pasha

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

がいこのコピー全体のハッシュがあるかもしれません何千ものエントリがすでに含まれているとします( "N" => ... "フレーズM" => ... <オリジナルのコピー%translations>)、この一時ハッシュを%変換に割り当てますか?もしそうであれば、このメソッドを使用するための重大なオーバーヘッドがありますが、そうでなければ十分に簡単です! – Pasha

+0

@ user958624:はい、そうです。値はこれらのサブリストから構成され、 '%翻訳 'に割り当てられます –

6

あなたはハッシュスライスに割り当てることができます。

@translations{@keys} = @values; 

または別のハッシュからのデータを使用して:

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

しかし、私は多くの新しいキーを追加しているので、キーとその値(対応するフレーズに対応する)の間の対応関係のトラック。 – Pasha

+0

@ user958624:あなたはキーと値の配列を使うことができます(アップデートを参照) –

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

はyi_Hの答えと同じ原理ですが、 '%翻訳を作成するだけでなく、既存のハッシュでもできることを示しています – plusplus

2

Hash::Merge別のオプションです。またhttps://metacpan.org/module/Hash::Merge

- ハッシュをコピーすることで、最適化についてはあまり心配しないでください - それは問題になる場合は、それに見えます。まず最初に、わかりやすい読み取り可能で保守可能なコードを作成してみてください。文字列値を持つ数千のキーのハッシュは大きくありません!あなたがあなたの質問に指定されていないものを

は、(キーのいずれかの衝突があるかどうか、すなわち、これまでのファイルから2つの「フレーズ1の読み取り...?

+0

Hash ::マージは、ネストされたデータ構造を持っていないか、重複したキーの特別な処理が必要な場合を除いて、過剰です。 – cjm

+1

私は同意します、それはこの場合ですが、存在の存在を知ることは有益なので、私はちょうどそれを言及すると思った。 – plusplus