2010-04-16 2 views
4

Disons que j'ai une constante hashref comme ce qui suit:Comment puis-je déréférencer une constante hashref?

use constant DOGS => { 
    Lassie => 'collie', 
    Benji => 'mutt', 
    Scooby => 'great dane', 
    Goofy => '???' 
}; 

Comment puis-je déréférencement correctement pour obtenir dire .. ils clés sur elle?

warn ref DOGS; # HASH at untitled line 12. 
warn keys(%{DOGS}); # Warning: something's wrong (empty list) 
warn keys(DOGS); # Type of arg 1 to keys must be hash (not constant item) 

Ce qui suit est la seule façon que je peux sembler pour le faire fonctionner:

my $dogs = DOGS; 
warn keys(%$dogs); # LassieBenjiGoofyScooby at untitled line 15. 

Qu'est-ce que je fais mal?

+1

Il y a plusieurs façons de définir des constantes en Perl, chacune avec différents bons et mauvais points. Quel problème résolvez-vous avec des constantes dans ce cas? –

Répondre

12

Cela fonctionne habituellement pour vous:

%{DOG()} 

Constantes sont généralement seulement les sous-marins. Mais pour facilité (et regarde), vous pourriez préférer utiliser Readonly, comme suggéré dans PBP.

Readonly::Hash my %DOG => 
    (Lassie => 'collie' 
    , Benji => 'mutt' 
    , Scooby => 'great dane' 
    , Goofy => '???' 
    ); 
+0

Parfait - et de bonnes informations supplémentaires. Merci! – makenai

-1

force dans un contexte de liste ...

warn keys(%{(DOGS)}); 
+0

-1 pour le culte de la cargaison. Il ne force pas le contexte de la liste mais brise le nom de la clé de hachage Perl magic. –

5

Perldoc est votre ami: perldoc constants

Vous pouvez avoir des ennuis si vous utilisez constantes dans un contexte qui cite automatiquement barewords (comme vrai pour tout appel de sous-programme). Pour par exemple, vous ne pouvez pas dire $ hash {CONSTANT} car "CONSTANT" sera interprété comme une chaîne. Utilisez $ hash {CONSTANT()} ou $ hash {+ CONSTANT} pour empêcher le mécanisme de guillemets à d'entrer. De même, puisque l'opérateur "=>" cite un mot immédiatement à sa gauche, vous avez "CONSTANT() => 'value'" (ou simplement utiliser une virgule à la place de la grande flèche) au lieu de "CONSTANT => 'value'".

warn keys %{DOG()} devrait faire l'affaire.

+0

Bon à savoir. Merci! – makenai

Questions connexes