2010-01-25 2 views
5

Мне нужно передать значение enum в perl, как я могу это сделать?Как создать тип перечисления в Perl?

вытягивать из этого потока: 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"; 

но не должен этот показатель возврата 0? или я понимаю это неправильно?

EDIT:

Так что-то вроде этого будет более предсказуем для перечислимого типа?

use strict; 

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

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

EDIT # 2

Кроме того, я хотел бы проверить на выбранной опции, но передать обратно слово, а затем значение. Как я могу получить лучшее из обоих примеров?

@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

Что вы подразумеваете под * index 0 *? –

+3

Вы прочитали принятый ответ на вопрос, который вы связали? В частности, часть сказанная, что Perl делает * не * имеет тип перечисления? Если да, откуда вы ожидаете «индекс 0»? – friedo

+0

@friedo Я согласен с вами, я просто хочу убедиться, что понимаю это право. Мне нужно иметь возможность установить HOME, но вернуть 0. Будет ли просто менять значение на 0? См. Редактировать –

ответ

2

константа не является перечисление (в Perl или любой язык, который я знаю)

Нет, потому что здесь то, что вы делаете, вставив в таблице символ связь между ключ HOME и буква Home, это также называется bareword in perl parlance. Таблица символов реализована с хешем, и нет никакой эквивалентности номера его ключей и порядка их добавления.

В вашем примере, что вы делаете, задается $perl_number->{type} = 'Home', а затем распечатывается $phone_number->{type}.

+0

Вызов таблицы символов на самом деле не имеет значения. Гораздо менее смущает людей сказать, что вы создаете подпрограмму, которая не принимает аргументов и возвращает постоянное значение. Оставь внутренности. –

+0

@brian Это мой ответ, вы можете оставить свой собственный, используя опцию «Добавить другой ответ» в нижней части экрана. –

+1

Конечно, я добавил свой ответ. Тем не менее, я также помогаю людям уточнять и корректировать свои собственные ответы. Таблицы символов являются ненужной путаницей здесь, и вы немного запутались в том, что происходит на самом деле. Вы можете предоставить более качественные ответы, если вы приложите больше внимания к ним, оставив ненужные детали. –

2

Если вы хотите перечисления, используйте модуль enum.

+0

Прочтите эту ссылку, в соответствии с вопросом. –

+1

Да, уже прочитал это. Это не меняет мой ответ. –

Смежные вопросы