Hash utilisant une constante ... Résolu

Le
Luc
Bonjour,

J'ai eu un problème avec les hash que j'ai résolu en cherchant sur
google.

Je viens ici afin que l'on m'explique ce qui se passe.


J'ai un module qui valide les paramètres reçus (CGI)

use constant PRM_UN => "po";

my $params = $cgi->Vars;

if( $params->{ PRM_UN } eq $params->{ "po" } ) {
print "aucun problème";
} else {
print "Surprenant!!";
}

Ça affichait (ça l'affiche encore d'ailleurs) "Surprenant!!"

Cependant


if( $params->{ PRM_UN . "" } eq $params->{ "po" } ) {
print "aucun problème";
} else {
print "Surprenant!!";
}

affiche "aucun problème"

Où est le problème!!

Pourtant, dans le script j'ai une dizaine de paramètres définis avec
use constant
et il y en a seulement un qui me cause des ennuis. La constante se
nomme POOL_PRM_POSITION
et sa valeur est "po".

J'ai un foreach dans lequel j'ai des "if" et "elsif" pour chacun de
mes paramètres.

J'ai vérifié le contenu du hash avec Data::Dumper, tout est beau.
Est-ce que la valeur "po" est particulière pour perl ???
Est-ce que le nom POOL_PRM_POSITION est utilisé par perl ???
Est-ce le fait que j'utilise une référence ???
Est-ce les extra-terrestres vont débarquer chez moi ???


Dois-je ajouter systématiquement <. ""> à la clef lorsque celle-ci est
une constante ?
Ou peut-être
my $var = PRM_UN;
$param->{ $var };

Merci d'éclairer ma lanterne

Luc

P.S.

J'ai trouvé cette solution à cet endroit :
http://mailman.anu.edu.au/pipermail/perl.sig/2005-June/000009.html
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #1754442
Luc wrote in message
if( $params->{ PRM_UN }


Un « bareword » entre les accolades d'un tableau associatif est considéré
comme une chaîne de caractères. Par exemple :

$color->{red} = 0x800000;

est équivalent à :

$color->{"red"} = 0x800000;

même si red est un nom de fonction déjà défini.

Paul Gaborit
Le #1756815
À (at) 21 Mar 2008 08:48:29 GMT,
Nicolas George
Luc wrote in message
if( $params->{ PRM_UN }


Un « bareword » entre les accolades d'un tableau associatif est considéré
comme une chaîne de caractères. Par exemple :

$color->{red} = 0x800000;

est équivalent à :

$color->{"red"} = 0x800000;

même si red est un nom de fonction déjà défini.


Tout à fait exact.

Si on veut utiliser une constante comme clé, il faut l'appeler
(actuellement, une constante en Perl n'est qu'une fonction presque
comme une autre) :

use constant TOTO => 'abc';

my %h = (abc => 1);

if (not defined $h{TOTO}) {
warn "Pas de clé TOTO dans 'h'n";
}

if (defined $h{TOTO()}) {
warn "Clé ", TOTO, " définie dans 'h'n";
}

--
Paul Gaborit - Perl en français -

Luc
Le #1756814
Merci pour vos explications.

Ce qui m'agace par contre, c'est que j'ai utilsé ce principe dans tous
mes scripts et c'est la première fois que je rencontre ce problème.

Lorsque la constante est définie dans un autre module, il faut mettre
des parenthèses car on appelle une fonction. Cependant, un moment
donné, je me suis rendu contre que l'on avait pas besoin de
paranthèses si la constante est définie dans le module que l'on
utilise.

J'ai donc omis les parenthèses me disant que je verrais rapidement si
la constante a été définie dans le module courrant ou non.
Cependant, avec l'étrange comportement que j'ai vu, je vais toujours
mettre les parenthèses.
Je préfère ajouter les paranethèses que d'ajouter une bizzareris
comme . ""

Merci beaucoup et bon week end!

Luc
Paul Gaborit
Le #1846711
À (at) Fri, 21 Mar 2008 06:48:47 -0700 (PDT),
Luc
J'ai donc omis les parenthèses me disant que je verrais rapidement si
la constante a été définie dans le module courrant ou non.
Cependant, avec l'étrange comportement que j'ai vu, je vais toujours
mettre les parenthèses.


Dans le module où la (fonction) constante est définie, il y a au moins
deux endroits où Perl risque de ne pas l'interpréter comme il faut si
on omet les parenthèses et c'est à chaque fois si on l'utilise comme
clé d'une table de hachage :

1- Dans :

$h{TOTO}

où il faut utiliser :

$h{TOTO()}

2- Dans

%h = (TOTO => "valeur")

où il faut utiliser :

%h = (TOTO() => "valeur");

Il y a quelques autres exceptions mais beaucoup moins surprenantes
(comme par exemple Foo::TOTO::Bar).

--
Paul Gaborit - Perl en français -
Publicité
Poster une réponse
Anonyme