2010-01-25 15 views
5

Muszę odrzucić wartość wyliczenia w perlu, jak mogę to zrobić?Jak utworzyć typ wyliczenia w Perlu?

ciągnąc z tego wątku: Does Perl have an enumeration type?

use strict; 

use constant { 
    HOME => 'home', 
    WORK => 'work', 
    MOBILE => 'mobile', 
}; 

my $phone_number->{type} = HOME; 
print "Enum: ".$phone_number->{type}."\n"; 

ale nie powinien tego indeksu powrotną 0? czy rozumiem to źle?

EDIT:

Więc coś w tym być bardziej expectable dla typu enum?

use strict; 

use constant { 
    HOME => 0, 
    WORK => 1, 
    MOBILE => 2, 
}; 

my $phone_number->{type} = HOME; 
print "Enum: ".$phone_number->{type}."\n"; 

EDIT # 2

Również chciałbym potwierdzić od wybranej opcji, ale przechodzą z powrotem Słowo, a następnie wartość. Jak mogę uzyskać najlepsze z obu przykładów?

@VALUES = (undef, "home", "work", "mobile"); 

sub setValue { 

if (@_ == 1) { 
    # we're being set 
    my $var = shift; 
    # validate the argument 
    my $success = _validate_constant($var, \@VALUES); 

    if ($success == 1) { 
     print "Yeah\n"; 
    } else { 
     die "You must set a value to one of the following: " . join(", ", @VALUES) . "\n"; 
    } 
} 
} 

sub _validate_constant { 
# first argument is constant 
my $var = shift(); 
# second argument is reference to array 
my @opts = @{ shift() }; 

my $success = 0; 
foreach my $opt (@opts) { 
    # return true 
    return 1 if (defined($var) && defined($opt) && $var eq $opt); 
} 

# return false 
return 0; 
} 
+0

Co masz na myśli przez * indeks 0 *? –

+3

Czy przeczytałeś zaakceptowaną odpowiedź na pytanie, które łączysz? Zwłaszcza część, o której mówi Perl * nie * ma typ wyliczeniowy? Jeśli tak, to gdzie spodziewacie się "indeksu 0"? – friedo

+0

@friedo Zgadzam się z tobą, chcę tylko upewnić się, że rozumiem to dobrze. Potrzebuję opcji ustawienia HOME, ale powrotu 0. Czy wystarczy zmienić wartość na 0? Zobacz Edycja –

Odpowiedz

2

Stała nie jest enum (w Perlu, lub jakikolwiek język znam)

Nie, bo tu co robisz jest wstawianie w tabeli symbol związek między klucz HOME i literalny Home, jest to również nazywane bareword w języku perl. Tablica symboli jest zaimplementowana za pomocą skrótu i ​​nie ma odpowiednika numeru swoich kluczy i kolejności, w jakiej zostały dodane.

W twoim przykładzie to, co robisz, to ustawienie $perl_number->{type} = 'Home', a następnie wydrukowanie $phone_number->{type}.

+0

Wywoływanie tabeli symboli nie ma znaczenia. Znacznie mniej mylące jest stwierdzenie, że tworzysz podprogram, który nie przyjmuje argumentów i zwraca stałą wartość. Pozostaw z niego wnętrzności. –

+0

@brian To jest moja odpowiedź, możesz zostawić własną korzystając z opcji "Dodaj kolejną odpowiedź" w dolnej części ekranu. –

+1

Oczywiście, dodałem swoją odpowiedź. Pomagam jednak również ludziom udoskonalać i poprawiać własne odpowiedzi. Tablice symboli są tu niepotrzebnym zamętem i wydajesz się nieco zdezorientowany tym, co się właściwie dzieje. Możesz zapewnić lepsze odpowiedzi, jeśli poświęcisz im więcej uwagi, pozostawiając niepotrzebne szczegóły. –

2

Aby uzyskać wyliczenia, należy użyć modułu enum.

+0

Przeczytaj wątek, do którego odnosi się ten odnośnik, zgodnie z pytaniem. –

+1

Tak, już to przeczytałeś. To nie zmienia mojej odpowiedzi. –

Powiązane problemy