OVH Cloud OVH Cloud

Remplacement de constantes

5 réponses
Avatar
Yves Martin
Bonjour,

J'apprécie beaucoup le fait de définir des constantes:
use constant KEY => "key";

Mais je n'ai toujours pas saisi comme utiliser ces constantes dans des
expressions comme:
$myhash{KEY}
/KEY/

Dans quels cas les constantes ne sont pas remplacées ?

Pour contourner, j'utilise parfois une affectation temporaire:
my $key = KEY;
$myhash{$key}
/$key/

Est-il possible de faire mieux ?

Merci d'avance pour vos éclaircissements.
Un RTFM du genre "man perlfunc / open" est le bienvenu, tant qu'il est
suffisamment ciblé ;)

--
Yves Martin

5 réponses

Avatar
Paul Gaborit
À (at) Tue, 10 Jan 2006 14:25:49 +0100,
Yves Martin écrivait (wrote):
J'apprécie beaucoup le fait de définir des constantes:
use constant KEY => "key";

Mais je n'ai toujours pas saisi comme utiliser ces constantes dans des
expressions comme:
$myhash{KEY}
/KEY/

Dans quels cas les constantes ne sont pas remplacées ?


À tous les endroits où Perl accepte un mot sans guillemets. Deux
exemples :

$myhash{KEY}
%a = (KEY => "valeur");

Dans ces deux cas, KEY sera reconnu comme un simple mot et non comme
la constante KEY.

Pour contourner, j'utilise parfois une affectation temporaire:
my $key = KEY;
$myhash{$key}
/$key/

Est-il possible de faire mieux ?


Oui. En fait, pour l'instant, une constante est une sub
constante. Donc :

$myhash{KEY()}
%a = (KEY() => "valeur");

Pour l'utilisation dans une expression rationnelle (ou, plus
généralement, dans une chaîne de caractères interpolée), je ne vois
que :

/@{[KEY]}/
"@{[KEY]}"

qui est un peu lourd ! Si quelqu'un a une meilleure idée...

Merci d'avance pour vos éclaircissements.
Un RTFM du genre "man perlfunc / open" est le bienvenu, tant qu'il est
suffisamment ciblé ;)


Heu... 'perldoc constant' dans la section "BUGS".

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
jl_morel
Dans l'article , a dit...

J'apprécie beaucoup le fait de définir des constantes:
use constant KEY => "key";

Mais je n'ai toujours pas saisi comme utiliser ces constantes dans des
expressions comme:
$myhash{KEY}
/KEY/

Dans quels cas les constantes ne sont pas remplacées ?

Pour contourner, j'utilise parfois une affectation temporaire:
my $key = KEY;
$myhash{$key}
/$key/

Est-il possible de faire mieux ?



Le module Readonly permet de définir des constantes qui s'interpolent bien.
Voir :

http://search.cpan.org/~roode/Readonly-1.03/Readonly.pm

#!/usr/bin/perl -w
use strict;
use Readonly;

Readonly my $VOEUX => "Meilleurs voeux";

print "$VOEUX à tousn";

__END__

HTH

--
J-L.M.
http://www.bribes.org/perl

Avatar
Paul Gaborit
À (at) 10 Jan 2006 17:28:21 GMT,
(Jean-Louis MOREL) écrivait (wrote):
Le module Readonly permet de définir des constantes qui s'interpolent bien.


Exact (je l'avais oublié celui-là ;-)).

Readonly a tout de même un petit défaut (outre de ne pas être dans la
distribution standard mais ce n'est pas vraiment un défaut), c'est
qu'il n'est pas reconnu lors de la compilation. Je m'explique... Si je
code :

use constant DEBUG => 0;

if (DEBUG) {
# ...
# plusieurs centaines d'instructions
}

Puisque DEBUG est à zéro et que c'est reconnu lors de la
*compilation*, le code à l'intérieur du 'if' n'est même pas compilé...

Avec Readonly ce n'est pas le cas.

Il y a aussi quelques autres rares cas de ralentissement cités dans la
doc de Readonly.

Mais tout cela n'est problèmatique que pour des applications
critiques... Et donc effectivement 'Readonly' a plein d'atouts qui
peuvent le rendre plus attractifs que 'constant' la plupart du temps.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Yves Martin
Heu... 'perldoc constant' dans la section "BUGS".



Mais tout cela n'est problèmatique que pour des applications
critiques... Et donc effectivement 'Readonly' a plein d'atouts qui
peuvent le rendre plus attractifs que 'constant' la plupart du temps.


Merci... très intéressant tout cela.
Maintenant je sais que "use constant" déclare en fait une fonction !

--
Yves Martin

Avatar
Yves Martin
Heu... 'perldoc constant' dans la section "BUGS".

Mais tout cela n'est problèmatique que pour des applications
critiques... Et donc effectivement 'Readonly' a plein d'atouts qui
peuvent le rendre plus attractifs que 'constant' la plupart du temps.


Merci... très intéressant tout cela.
Maintenant je sais que "use constant" déclare en fait une fonction !

--
Yves Martin