12
votes

Constantes de hachage à Perl

J'ai une situation dans laquelle j'ai une application et qu'il correspond à un répertoire, je dois traiter dans un zipfile. Le mappage est assez simple: xxx

c'est-à-dire si le nom du fichier commence par cwa , je connais le répertoire que je dois à MUNGE est sous Financial . Si le nom du fichier commence par un ifa , je sais que le nom du répertoire est ifa . Je voudrais configurer cela comme un hachage (assez facile), mais comme ces valeurs ne changent pas vraiment, je voudrais configurer cette clé => Cartographie de la valeur en tant que constante de hachage.

Je ne crois pas que cela soit possible, alors j'aimerais faire la prochaine meilleure chose. Qu'est-ce que cela serait-il? Ou, pouvez-vous configurer une constante de hasch?

Je pense à écrire un sous-programme où vous passez un paramètre et renvoie la valeur correcte. Après tout, c'est vraiment la façon dont les constantes travaillent elles-mêmes, et cela garantirait que les relations entre les clés et les valeurs ne changent pas dans le programme.

ou, je peux simplement déclarer la clé => relation de valeur au début de mon programme et espérons que la clé => Les paires de valeur ne sont pas modifiées par quelque chose. Ce serait plus facile à lire et plus facile à modifier si vous devez le faire depuis le début de mon code source.

Quel est le meilleur moyen d'implémenter une clé => valeur de valeur?


0 commentaires

4 Réponses :


9
votes
  1. Il suffit d'utiliser un hachage nommé. Très probablement, rien ne va mal.

  2. Utilisez Readonly . Cela rend un hachage qui est accessible comme n'importe quel autre hachage, mais ne peut être modifié que si quelqu'un commence à se briser dans les internaux Perl. Comme indiqué dans ses documents, il est lent que celui d'un accès variable régulier, mais il est très peu probable d'être assez lent pour la matière pour vous.

  3. masque le hachage dans un sous-programme.

    . xxx

    ou même xxx


3 commentaires

Mieux vaut définir la carte My% en dehors de la fonction, juste au-dessus (et la fonction dans un module séparé au code d'appel, de sorte que ma variable soit cachée). Cela évite la réinitialisation inutile du hachage chaque fois que vous appelez la fonction.


C'est un bon point. Ou, en 5.10+, utilisez état qui donne la meilleure cachette mais n'initialise toujours qu'une seule fois.


La seconde fonctionne, mais je devais faire {+ Shift}. Sinon, il a fallu {Shift} comme l'index lui-même.



10
votes

Vous pouvez utiliser const :: rapide code> .

use Const::Fast;
const my %hash = (
    CWA => "Financial",
    PIP => "",
    IFA => "IFA",
    VDX => "Financial",
);


1 commentaires

Remerciements pour Const :: Fast: "L'interface de ce module a été inspirée par Eric Roode's's Roodonly. La mise en œuvre s'inspire de tout ce que le fait de la manière opposée."



3
votes

ici ce que j'ai finalement fait suite à quelques suggestions: xxx

en mettant le % apphash dans son propre bloc, je ne peux pas faire référence à ce hachait dans le reste de mon code. Cependant, le sous-programme appdir est dans le même bloc et peut le référer. Et, étant donné que les sous-routines sont larges, je peux accéder à ce sous-programme dans mon code. Par conséquent, je peux accéder aux valeurs de % apphash , mais je ne peux pas les modifier. xxx

soie!

Merci < Un href = "https://stackoverflow.com/users/87583/ijw"> iwj et Hobbs


4 commentaires

Pourquoi voudriez-vous éteindre strict et avertissements ?? O_o


@antred, avec strict et avertissements activés, le premier $ APPHASH {CWA} (compteur) n'aurait pas compilé.


édité pour désactiver les strictures et les avertissements dans une portée inférieure. Et a ajouté un avertissement important pour répondre au commentaire Snarky "O_o" de Snarky "


Hé, cela a peut-être été un commentaire snarky mais cela vous a fait de retourner et d'améliorer votre réponse. 😝



3
votes

Alternativente, si vous ne voulez pas utiliser de blocs, vous pouvez toujours utiliser constant:

use strict;
use warnings;

use constant CONSHASH => sub {{
    foo1 => 'bar1',
    foo2 => 'bar2',
    foo3 => 'bar3',
}->{ +shift }};

print CONSHASH->('foo1') . "\n";
print CONSHASH->('foo2') . "\n";
print CONSHASH->('foo3') . "\n";


0 commentaires