Utiliser des constantes comme clés de hachages

Le
Manuel Pégourié-Gonnard
Bonjour,

Y a-t-il moyen d'utiliser une constante (définie avec use constant)
comme clé d'un hachage ? J'ai l'impression que Perl va toujours
transformer un "bareword" en chaîne dans ce contexte et que c'est donc
impossible. J'ai manqué quelque chose ?

Le script suivant montre que la clé est 'const' et non pas la valeur de
la constante associée.

use constant { 'const' => 'key' };
my $var = const;
my %hash = (const => 'value', 'key2' => 'value2');
$hash{const} = 'value3';
print "$_" for keys %hash;



--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
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
Manuel Pégourié-Gonnard
Le #20490451
Manuel Pégourié-Gonnard scripsit :

Y a-t-il moyen d'utiliser une constante (définie avec use constant)
comme clé d'un hachage ? J'ai l'impression que Perl va toujours
transformer un "bareword" en chaîne dans ce contexte et que c'est donc
impossible. J'ai manqué quelque chose ?



Ah oui, j'avais oublié de relire la doc de constant avant de poser ma
question. C'est indiqué dans la section "caveat". Désolé pour le bruit.

use constant { 'const' => 'key' };
my $var = const;
my %hash = (const => 'value', 'key2' => 'value2');


my %hash = (+const => 'value'); # interprète const comme une constante

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Paul Gaborit
Le #20491651
À (at) Thu, 5 Nov 2009 01:10:53 +0100 (CET),
Manuel Pégourié-Gonnard
Manuel Pégourié-Gonnard scripsit :

Y a-t-il moyen d'utiliser une constante (définie avec use constant)
comme clé d'un hachage ? J'ai l'impression que Perl va toujours
transformer un "bareword" en chaîne dans ce contexte et que c'est donc
impossible. J'ai manqué quelque chose ?



Ah oui, j'avais oublié de relire la doc de constant avant de poser ma
question. C'est indiqué dans la section "caveat". Désolé pour le bruit.

use constant { 'const' => 'key' };
my $var = const;
my %hash = (const => 'value', 'key2' => 'value2');


my %hash = (+const => 'value'); # interprète const comme une constante



Heu... La technique du plus (+const) ne fonctionne malheureusement que
dans le cas évoqué par la doc. À savoir, si on utilise une constante
comme une clé d'accès dans une table de hachage... Dans le contexte de
l'exemple que tu donnes ci-dessus, ça ne fonctionne pas : '+const' est
utilisé exactement comme 'const'.

Il vaut donc mieux utiliser les parenthèses qui elles fonctionnent à
tous les coups :

my %hash = (const() => 'value'); # interprète const comme une constante

En fait, en Perl, actuellement, une constante n'est qu'une fonction
sans paramètre.

--
Paul Gaborit - Perl en français -
Paul Gaborit
Le #20491641
À (at) Thu, 05 Nov 2009 10:12:11 +0100,
Paul Gaborit
Il vaut donc mieux utiliser les parenthèses qui, elles, fonctionnent à
tous les coups :

my %hash = (const() => 'value'); # interprète const comme une constante

En fait, en Perl, actuellement, une constante n'est qu'une fonction
sans paramètre.



Au fait, j'oubliais : il faut respecter les conventions
d'écriture. Une constante, par convention, porte toujours, sauf très
rares exceptions, un nom entièrement en MAJUSCULES ! Donc :

use constant CONST => 'essai';

$h{CONST()} = 3;
%h = (CONST() => 3);

--
Paul Gaborit - Perl en français -
Manuel Pégourié-Gonnard
Le #20491751
Paul Gaborit scripsit :

À (at) Thu, 05 Nov 2009 10:12:11 +0100,
Paul Gaborit
Il vaut donc mieux utiliser les parenthèses qui, elles, fonctionnent à
tous les coups :

my %hash = (const() => 'value'); # interprète const comme une constante





Ok, merci.

En fait, en Perl, actuellement, une constante n'est qu'une fonction
sans paramètre.





Ah, je comprends mieux alors.

Au fait, j'oubliais : il faut respecter les conventions
d'écriture. Une constante, par convention, porte toujours, sauf très
rares exceptions, un nom entièrement en MAJUSCULES ! Donc :

use constant CONST => 'essai';

$h{CONST()} = 3;
%h = (CONST() => 3);



Ok.

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Publicité
Poster une réponse
Anonyme