Gibt es eine Möglichkeit, eine „Konstante“ als Hash-Schlüssel in Perl zu benutzen?

StackOverflow https://stackoverflow.com/questions/96848

  •  01-07-2019
  •  | 
  •  

Frage

Gibt es eine Möglichkeit, eine Konstante als Hash-Schlüssel zu benutzen?

Zum Beispiel:

use constant X => 1;

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

Der obige Code wird einen Hash mit „X“ als Schlüssel und nicht 1 als Schlüssel erstellen. Während möchte ich den Wert der Konstanten X als Schlüssel verwenden.

War es hilfreich?

Lösung

use constant macht eigentlich konstant Subroutinen.

tun, was Sie wollen, müssen Sie die Unter explizit nennen:

use constant X => 1;

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

oder

use constant X => 1;

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

Andere Tipps

Eine weitere Möglichkeit ist die Verwendung konstant Pragma zu verwenden und Flip auf Read-Only gemäß Empfehlungen in dem Perl Best Practices von Damian Conway.

wechselte ich eine Weile zurück, nachdem sie erkannt, dass ein konstantes Hash-ref ist nur ein konstanter Verweis auf den Hash, aber tut nichts über die Daten innerhalb des Hash.

Die Nur-Lese-Syntax „normal aussehende“ Variablen erstellt, sondern tatsächlich die Durchgängigkeit oder readonlyness erzwingen. Sie können es verwenden, wie würden Sie eine andere Variable als Schlüssel.


use Readonly;

Readonly my $CONSTANT => 'Some value';

$hash{$CONSTANT} = 1;

Ihr Problem ist, dass => ein magisches Komma ist, die das Wort vor ihm automatisch zitiert. Also, was Sie geschrieben haben, ist äquivalent zu ( 'X', 'X').

Der einfachste Weg ist nur ein Komma zu verwenden:

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

Sie können aber verschiedene Zeichensetzung hinzufügen, so dass Sie nicht mehr ein einfaches Wort vor dem =>:

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

Mit $hash{CONSTANT()} oder $hash{+CONSTANT} die Bareword zu verhindern Quoting-Mechanismus in von treten.

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

Die meisten anderen Leute haben Ihre Frage gut beantwortet. Zusammengenommen bilden diese eine sehr ausführliche Erklärung des Problems und empfohlenen Workarounds. Das Problem ist, dass die Perl Pragma „Konstante verwenden“ wirklich ein Unterprogramm im aktuellen Paket, das schafft Name ist das erste Argument des Pragma und dessen Wert das letzte Mal.

In Perl, sobald ein Unterprogramm deklariert ist, kann es ohne parens genannt werden.

Das Verständnis, dass „Konstanten“ sind einfach Subroutinen, können Sie sehen, warum sie in Strings nicht interpolieren und warum der „Fett Komma“ Operator „=>“, die auf das linke Argument zitiert denkt, dass haben Sie es einen String übergeben ( versuchen, andere integrierte Funktionen wie time () und Tasten () irgendwann mit dem Fett Komma für zusätzlichen Spaß).

Zum Glück können Sie die Konstante mit expliziter Interpunktion wie Pars oder kaufmännischen Sigill aufrufe.

Allerdings habe ich eine Frage für Sie: warum sind Sie Konstanten für Hash-Schlüssel überhaupt mit?

Ich kann von ein paar Szenarien denken, dass Sie in diese Richtung führen könnte:

  1. Sie wollen die Kontrolle über die Schlüssel in der Hash sein kann.

  2. Sie möchten abstrakt den Namen der Tasten, falls diese Änderung später

Im Fall der Nummer 1 wird die Konstante wahrscheinlich die Hash nicht speichern. Stattdessen sollten Sie eine Klasse erstellen, die öffentlichen Getter und Setter hat, die einen Hash sichtbar nur auf das Objekt zu füllen. Dies ist ein sehr un-Perl wie Lösung, aber sehr einfach zu tun.

Im Fall der Nummer 2, würde ich immer noch stark befürworten für eine Klasse. Wenn der Zugriff auf die Hash durch eine gut definierte Schnittstelle geregelt ist, nur der Implementierer der Klasse ist die Hash-Schlüsselnamen für immer Recht verantwortlich. In diesem Fall würde ich nicht empfehlen Konstanten überhaupt verwendet wird.

Hope, das hilft und vielen Dank für Ihre Zeit.

Die use constant Pragma erstellt ein Unterprogramm prototypisiert keine Argumente zu nehmen. Während es sieht wie eine C-Stil konstant, es ist wirklich ein Unterprogramm, das einen konstanten Wert zurückgibt.

Die => (Fett Komma) automatisch zitiert linken Operanden, wenn seine Bareword, ebenso wie die $ hash {key} Notation.

Wenn Ihre Nutzung der konstanten Namen wie ein Bareword aussieht, werden die unter Angabe Mechanismen treten in und Sie werden seinen Namen als Schlüssel anstelle seines Wertes erhalten. Um dies zu verhindern, die Nutzung zu ändern, so dass es kein Bareword ist. Zum Beispiel:

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

In initializers, können Sie auch die Ebene Komma stattdessen verwenden:

%hash = (X, 1);

=> Operator interpretiert die linke Seite als "string", die Art und Weise qw () der Fall ist.

Versuchen Sie es mit

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

Eine Möglichkeit ist, X wie (X) zu kapseln:

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

Eine weitere Option ist mit '=>' und der Verwendung zu tun, weg '' statt:

my %x ( X, 1 );

Kommentar @shelfoo (Ruf nicht hoch genug Kommentar hinzufügen direkt dort noch!)

Völlig einig über Perl Best Practices von Damian Conway ... seine sehr zu empfehlen Lesung.

Allerdings finden Sie unter PBP Module Empfehlung Kommentar , die einen nützlichen „errata ist "wenn Sie planen, PBP zu verwenden für ein in-house-Styleguide.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top