12
votes

Comment insérer hachage dans hachage dans perl

J'ai un hasch simple défini quelque part dans le fichier principal xxx

dans un autre fichier, je veux ajouter quelques traductions supplémentaires. C'est-à-dire que je veux faire quelque chose comme ceci: xxx

Bien sûr, ce code ne fonctionnerait pas: poussant 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?

Je ne voudrais pas recourir à xxx

Étant donné que dans Perl, vous êtes censé pouvoir faire des choses sans trop répétition dans votre code ...


0 commentaires

5 Réponses :


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

2 commentaires

Est-ce que cela copie tout le hachage? C'est-à-dire supposer que % de traductions 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



7
votes

Vous pouvez attribuer à une tranche de hachage: xxx

ou en utilisant des données d'un autre hachage: xxx


2 commentaires

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)



17
votes
%translations = (%translations, %new_translations);

1 commentaires

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



10
votes

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",
};


3 commentaires

CA aide! Je peux même l'écrire comme @translations {keys% $ _} = valeurs $% _ pour {"phrase n" => "bla-blah", ...};


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 $ _.



2
votes

hachage :: fusion est une autre option: https: // METACPAN. org / module / hachage :: fusion

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!

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 ...?


2 commentaires

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.