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

Utiliser des constantes comme clés de hachages

4 réponses
Avatar
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 "$_\n" for keys %hash;



--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/

4 réponses

Avatar
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

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

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 - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Paul Gaborit
À (at) Thu, 05 Nov 2009 10:12:11 +0100,
Paul Gaborit écrivait (wrote):

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 - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Manuel Pégourié-Gonnard
Paul Gaborit scripsit :

À (at) Thu, 05 Nov 2009 10:12:11 +0100,
Paul Gaborit écrivait (wrote):

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/