it-swarm.com.de

Hat Perl einen Aufzählungstyp?

Hat Perl einen Aufzählungstyp , der den Best Practices entspricht, oder, was noch wichtiger ist, braucht es eine?

Das Projekt, an dem ich arbeite, verwendet überall Strings, um Dinge zu kennzeichnen, die normalerweise ein Enum in einer Sprache wie C # verwenden würden. Zum Beispiel haben wir eine Reihe von Telefonnummern in einem Array von Hashes, die jeweils einem Telefontyp zugeordnet sind ("Zuhause", "Arbeit", "Mobil" usw.):

$phone_number->{type} = 'Home';

Wäre es ausreichend, hier eine schreibgeschützte Menge von Variablen zu verwenden, oder sollte eine Aufzählung verwendet werden? Ich habe ein enum-Modul in CPAN gefunden, aber es scheint, dass es bloße Wörter verwendet, die gegen eine der Best Practices Perl verstoßen. Meine Überlegungen zur Verwendung von Read-Only-Variablen sieht ungefähr so ​​aus:

use Readonly;

Readonly my $HOME   => 'Home';
Readonly my $WORK   => 'Work';
Readonly my $MOBILE => 'Mobile';

$phone_number->{type} = $HOME;

Ist das ein guter Ansatz oder gibt es einen besseren Weg?

54
cowgod

Nein, es gibt kein integriertes Enumerationskonstrukt. Perl macht nicht viel striktes Tippen, also denke ich, dass es eigentlich kaum einen gibt.

Meiner Meinung nach ist der von Ihnen verwendete Readonly Ansatz solide.

Es gibt auch das traditionellere constant / pragma.

use constant {
    HOME   => 'Home',
    WORK   => 'Work',
    MOBILE => 'Mobile',
};

$phone_number->{type} = HOME;

Hinter den Kulissen wird für jede Konstante eine Funktion eingerichtet, die den Wert zurückgibt.

sub HOME () { 'Home' }

Ich würde bei Readonly bleiben, es sei denn, Sie möchten diese Eigenschaft nutzen, zum Beispiel:

package Phone::Type;

use constant {
    HOME => 'Home',
    #...
};

package main;

print Phone::Type->HOME, "\n";
40
Ronald Blaschke

Perl hat tatsächlich einen Aufzählungstyp wie in C. Versuchen Sie dies für Details.

perldoc enum

Zum Beispiel:

use enum qw(HOME WORK MOBILE);

Jetzt haben wir:

HOME == 0
WORK == 1
MOBILE == 2

Sie können die Indikatoren auch selbst einstellen:

use enum qw(HOME=0 WORK MOBILE=10 FAX);

Jetzt haben wir:

HOME == 0
WORK == 1
MOBILE == 10
FAX == 11

Siehe here für weitere Details.

Beachten Sie, dass dies nicht in jeder Perl-Version unterstützt wird. Ich weiß, dass v5.8.3 dies nicht unterstützt, während v5.8.7 dies tut.

20
Nathan Fellman

Perl unterstützt das Konzept nicht nativ, es gibt jedoch Module, um diese Funktionalität hinzuzufügen

https://metacpan.org/pod/enum

11
Ray Booysen

Ihr Weg ist mehr als ausreichend.

Sie können auch mit Moose :: Util :: TypeConstraints Enums erstellen, wenn Sie Moose verwenden. (Was du sein solltest.)

8
jrockway

Ich fürchte, Perl ist in Bezug auf diese Enumerationen und benannten Konstanten völlig querschnittsgelähmt:

  • enum und Readonly sind keine Kernmodule (zumindest bei Perl 5.8, die ich gerade geprüft habe). Daher sind diese möglicherweise auf einem System nicht verfügbar, auf dem neue Module nicht installiert werden können.

  • "use Constant" mit "use strict" (die man immer verwenden sollte) ist völlig unbrauchbar, da es eine Menge schrecklicher Fehlermeldungen der folgenden Form erzeugt:

    Bareword "FRED" ist nicht zulässig, solange "strikte Subs" verwendet werden

Hoffen wir, dass sie dieses Durcheinander in Perl 6 in Ordnung gebracht haben, falls dies jemals das Tageslicht erblickt!

5
John Roberts

Das funktionierte gut für mich ...

use constant MYENUM => qw(ZERO ONE TWO THREE FOUR);

BEGIN {
    eval "use constant (MYENUM)[$_] => $_;" foreach 0..(MYENUM)-1;
}

Sie können dann ZERO, ONE, TWO etc als Konstanten verwenden und ihren symbolischen Namen mit (MYENUM)[$value] ausdrucken.

0
kbro