Hash utilisant une constante ... Résolu

Le
Luc
Bonjour,

J'ai eu un problme avec les hash que j'ai rsolu en cherchant sur
google.

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


J'ai un module qui valide les paramtres reus (CGI)

use constant PRM_UN => "po";

my $params = $cgi->Vars;

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

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

Cependant


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

affiche "aucun problme"

O est le problme!!

Pourtant, dans le script j'ai une dizaine de paramtres dfinis 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 paramtres.

J'ai vrifi le contenu du hash avec Data::Dumper, tout est beau.
Est-ce que la valeur "po" est particulire pour perl ???
Est-ce que le nom POOL_PRM_POSITION est utilis par perl ???
Est-ce le fait que j'utilise une rfrence ???
Est-ce les extra-terrestres vont dbarquer chez moi ???


Dois-je ajouter systmatiquement <. ""> 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
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