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: c'est-à-dire si le nom du fichier commence par 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? P> 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. P> 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. P> Quel est le meilleur moyen d'implémenter une clé => valeur de valeur? P> p> cwa code>, je connais le répertoire que je dois à MUNGE est sous
Financial code>. Si le nom du fichier commence par un
ifa code>, je sais que le nom du répertoire est
ifa code>. 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. P>
4 Réponses :
Il suffit d'utiliser un hachage nommé. Très probablement, rien ne va mal. P> li>
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. P> Li>
masque le hachage dans un sous-programme. p> li>
. p> ou même p>
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 code> 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.
Vous pouvez utiliser const :: rapide code>
.
use Const::Fast; const my %hash = ( CWA => "Financial", PIP => "", IFA => "IFA", VDX => "Financial", );
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."
ici ce que j'ai finalement fait suite à quelques suggestions: en mettant le soie! P> Merci < Un href = "https://stackoverflow.com/users/87583/ijw"> iwj et Hobbs p> p> % apphash code> dans son propre bloc, je ne peux pas faire référence à ce hachait dans le reste de mon code. Cependant, le sous-programme code> appdir code> 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 code>, mais je ne peux pas les modifier. P>
Pourquoi voudriez-vous éteindre strict et avertissements ?? O_o
@antred, avec strict et avertissements activés, le premier $ APPHASH {CWA} code> (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. 😝
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";