Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Hash utilisant une constante ... Résolu

4 réponses
Avatar
Luc
Bonjour,

J'ai eu un probl=E8me avec les hash que j'ai r=E9solu 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=E8tres re=E7us (CGI)

use constant PRM_UN =3D> "po";

my $params =3D $cgi->Vars;

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

=C7a affichait (=E7a l'affiche encore d'ailleurs...) "Surprenant!!"

Cependant


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

affiche "aucun probl=E8me"

O=F9 est le probl=E8me!!

Pourtant, dans le script j'ai une dizaine de param=E8tres d=E9finis 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=E8tres.

J'ai v=E9rifi=E9 le contenu du hash avec Data::Dumper, tout est beau.
Est-ce que la valeur "po" est particuli=E8re pour perl ???
Est-ce que le nom POOL_PRM_POSITION est utilis=E9 par perl ???
Est-ce le fait que j'utilise une r=E9f=E9rence ???
Est-ce les extra-terrestres vont d=E9barquer chez moi ???


Dois-je ajouter syst=E9matiquement <. ""> =E0 la clef lorsque celle-ci est
une constante ?
Ou peut-=EAtre
my $var =3D PRM_UN;
$param->{ $var };

Merci d'=E9clairer ma lanterne

Luc

P.S.

J'ai trouv=E9 cette solution =E0 cet endroit :
http://mailman.anu.edu.au/pipermail/perl.sig/2005-June/000009.html

4 réponses

Avatar
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.

Avatar
Paul Gaborit
À (at) 21 Mar 2008 08:48:29 GMT,
Nicolas George <nicolas$ écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Luc
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
Avatar
Paul Gaborit
À (at) Fri, 21 Mar 2008 06:48:47 -0700 (PDT),
Luc écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>