Как вставить хеш в хэш в 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, прочитанные из файлов...?