Question

Y a-t-il un moyen d'utiliser une constante comme clé de hachage?

Par exemple:

use constant X => 1;

my %x = (X => 'X');

Le code ci-dessus créera un hachage avec "X". comme clé et pas 1 comme clé. Alors que je veux utiliser la valeur de la constante X comme clé.

Était-ce utile?

La solution

use constant crée en fait des sous-routines constantes.

Pour faire ce que vous voulez, vous devez appeler explicitement le sous:

use constant X => 1;

my %x = ( &X => 'X');

ou

use constant X => 1;

my %x = ( X() => 'X');

Autres conseils

Une autre option consiste à ne pas utiliser pragma constant et à basculer sur Readonly conformément aux recommandations des meilleures pratiques Perl de Damian Conway.

J'ai changé de temps après avoir réalisé que les références de hachage constantes n'étaient qu'une référence constante au hachage, mais ne faites rien concernant les données contenues dans le hachage.

La syntaxe en lecture seule crée une "apparence normale". variables, mais va effectivement imposer la constance ou la lecture seule. Vous pouvez l'utiliser comme n'importe quelle autre variable en tant que clé.


use Readonly;

Readonly my $CONSTANT => 'Some value';

$hash{$CONSTANT} = 1;

Votre problème est que = > est une virgule magique qui cite automatiquement le mot qui le précède. Donc, ce que vous avez écrit est équivalent à ('X', 'X').

La méthode la plus simple consiste à utiliser une virgule:

my %x = (X, 'X');

Vous pouvez également ajouter divers signes de ponctuation pour que vous n'ayez plus un mot simple devant le = >:

.
my %x = ( X() => 'X' );
my %x = ( &X => 'X' );

Utilisez $ hash {CONSTANT ()} ou $ hash {+ CONSTANT} pour empêcher le mécanisme de citation de mots nus de démarrer.

De: http://perldoc.perl.org/constant.html

La plupart des autres personnes ont bien répondu à votre question. Pris ensemble, ceux-ci créent une explication très complète du problème et des solutions de contournement recommandées. Le problème est que le pragma Perl "utilise une constante". crée vraiment un sous-programme dans votre paquet actuel dont le nom est le premier argument du pragma et dont la valeur est le dernier.

En Perl, une fois qu'un sous-programme est déclaré, il peut être appelé sans parenthèse.

Comprendre que "constantes" sont simplement des sous-programmes, vous pouvez voir pourquoi ils ne sont pas interpolés dans des chaînes et pourquoi la "grosse virgule" opérateur " = > " qui cite l'argument de la main gauche pense que vous lui avez attribué une chaîne (essayez d'autres fonctions intégrées comme time () et keys () de temps en temps avec une grosse virgule pour plus de plaisir).

Heureusement, vous pouvez invoquer la constante en utilisant une ponctuation explicite telle que parens ou le sigil des esperluettes.

Cependant, j'ai une question pour vous: pourquoi utilisez-vous des constantes pour les clés de hachage?

Je peux penser à quelques scénarios qui pourraient vous mener dans cette direction:

  1. Vous voulez contrôler les clés pouvant figurer dans le hachage.

  2. Vous souhaitez extraire le nom des clés au cas où celles-ci seraient modifiées ultérieurement

Dans le cas du numéro 1, les constantes ne sauveront probablement pas votre hachage. Au lieu de cela, envisagez de créer une classe comportant des paramètres publics et des getters qui renseignent un hachage visible uniquement par l'objet. C’est une solution très peu semblable à Perl, mais très facile à faire.

Dans le cas du numéro 2, je préconiserais toujours fortement une classe. Si l'accès au hachage est régulé via une interface bien définie, seul l'implémenteur de la classe est responsable de la définition correcte des noms de clé de hachage. Dans ce cas, je ne recommanderais pas du tout d'utiliser des constantes.

J'espère que cela vous aide et vous remercie pour votre temps.

La pragma d'utilisation constante crée un sous-programme prototypé ne prenant aucun argument. Bien qu’elle ressemble à une constante de style C, il s’agit en réalité d’un sous-programme qui renvoie une valeur constante.

Le = > (grosse virgule) cite automatiquement l'opérande de gauche s'il s'agit d'un mot nu, tout comme la notation $ hash {clé}.

Si votre utilisation du nom de la constante ressemble à un mot simple, les mécanismes de citation entreront en vigueur et vous obtiendrez son nom en tant que clé au lieu de sa valeur. Pour éviter cela, modifiez l'utilisation afin que ce ne soit pas un mot clé. Par exemple:

use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;

Dans les initialiseurs, vous pouvez également utiliser la virgule simple à la place:

%hash = (X, 1);

= > L’opérateur interprète son côté gauche comme une "chaîne", comme le fait qw ().

Essayez d'utiliser

my %x = ( X, 'X');

L’une des méthodes consiste à encapsuler X sous la forme (X):

my %x ( (X) => 1 );

Une autre option consiste à supprimer "= >" et utilisez ',' à la place:

my %x ( X, 1 );

Commentez @shelfoo (la réputation n'est pas assez élevée pour ajouter un commentaire directement!)

Je suis tout à fait d’accord sur les meilleures pratiques Perl de Damian Conway ... une lecture hautement recommandée.

Cependant, veuillez lire le le commentaire de recommandation de module PBP , qui est utile " errata " si vous envisagez d’utiliser PBP pour un guide de style interne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top