J'ai un hasch simple défini quelque part dans le fichier principal dans un autre fichier, je veux ajouter quelques traductions supplémentaires. C'est-à-dire que je veux faire quelque chose comme ceci: p> Bien sûr, ce code ne fonctionnerait pas: Je ne voudrais pas recourir à p> Étant donné que dans Perl, vous êtes censé pouvoir faire des choses sans trop répétition dans votre code ... p> p> poussant code> ne fonctionne pas avec les hachages. Donc, ma question est la suivante: qu'est-ce qu'un moyen simple et élégant d'insérer un hachage de valeurs dans un hachage existant? P>
5 Réponses :
%translations = ( "phrase N" => "blah-blah", # .... "phrase M" => "something", %translations );
Est-ce que cela copie tout le hachage? C'est-à-dire supposer que % de traductions code> contient plusieurs milliers d'entrées déjà. Seriez-vous Solution Créer un hachage Temp ("Phrase n" => ..., "Phrase m" => ..., ), puis attribuez à ce hachage TEMP sur% traductions? Si tel est le cas, il y aura une surcharge importante pour utiliser cette méthode, sinon il semble assez simple!
@ user958624: oui, ça fait. Une nouvelle valeur de liste est construite à partir de ces sublistes et attribué à % Traductions Code>
Vous pouvez attribuer à une tranche de hachage: ou en utilisant des données d'un autre hachage: p>
Cependant, depuis que j'ajoute de nombreuses nouvelles clés, il sera vraiment difficile de garder une trace de la correspondance entre les clés et leurs valeurs (quelle traduction correspond à la phrase).
@ user958624: Vous pouvez utiliser des tableaux pour les clés et les valeurs (voir la mise à jour)
%translations = (%translations, %new_translations);
même principe que la réponse de Yi_H, mais montrant que vous pouvez le faire sur les hachages existants, pas seulement en créant % de traductions code>
Vous pouvez attribuer à une tranche de hachage à l'aide du clés et valeurs fonctions. Tant que le hachage n'est pas modifié entre les appels, clés code> retournera les touches dans le même ordre que les valeurs code> code> renvoie les valeurs.
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",
};
CA aide! Je peux même l'écrire comme @translations {keys% $ _} = valeurs $% _ pour {"phrase n" => "bla-blah", ...}; code>
Cette syntaxe ne m'a pas eue, mais c'est un raccourci intelligent. La boucle le rend probablement un cheveu moins efficace, mais je doute que la différence soit mesurable.
Eh bien, c'est une boucle sur un seul élément. Plus d'un moyen pratique d'affecter le hachage anonyme à la variable $ _.
Aussi - Ne vous inquiétez pas trop sur l'optimisation dans la copie des hachages - si cela devient un problème, examinez-le alors. Essayez simplement d'écrire un bon code lisible et maintenu clair d'abord. Un hachage de plusieurs milliers de clés avec des valeurs de chaîne n'est pas grand! P>
Qu'est-ce que vous n'avez pas spécifié dans votre question, est de savoir s'il y aura une collision de clés (c'est-à-dire que vous pourriez y avoir deux 'phrase 1's lire des fichiers ...? P> hachage :: fusion code> est une autre option: https: // METACPAN. org / module / hachage :: fusion p>
HASH :: La fusion est surchargée à moins que vous n'ayez une structure de données imbriquée ou si vous avez besoin d'un traitement spécial des clés en double.
Je suis d'accord, c'est dans ce cas, mais vous êtes utile de connaître l'existence de, alors pensais que je voudrais juste la mentionner.