Как вставить хеш в хэш в Perl

У меня есть простой хеш, определенный где-то в главном файле

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 вы должны иметь возможность делать что-либо без слишком много повторения в вашем коде...

Ответ 1

Вы можете назначить хэш-фрагмент с помощью keys и values функций. Пока хеш не изменяется между вызовами, 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 = (%translations, %new_translations);

Ответ 3

Вы можете назначить хэш-фрагмент:

@translations{@keys} = @values;

или используя данные из другого хэша:

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

Ответ 4

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

Ответ 5

Hash::Merge - это еще один вариант: https://metacpan.org/module/Hash::Merge

также - не слишком беспокоитесь об оптимизации при копировании хэшей - если это становится проблемой, тогда загляните в нее. Просто попробуйте написать хороший понятный и удобный код в первую очередь. Хеш из нескольких тысяч ключей со строковыми значениями невелик!

то, что вы не указали в своем вопросе, будет ли какое-либо столкновение ключей (т.е. может ли быть когда-нибудь две фразы 1, прочитанные из файлов...?