Как я могу создать тип перечисления в Perl? - PullRequest
5 голосов
/ 25 января 2010

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

извлечение из этой темы: Есть ли в Perl тип перечисления?

use strict;

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

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

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

EDIT:

Так что-нибудь подобное будет более ожидаемым для типа enum?

use strict;

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

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

РЕДАКТИРОВАТЬ # 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;
}

Ответы [ 2 ]

2 голосов
/ 26 января 2010

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

2 голосов
/ 25 января 2010

Константа не является перечислением (на perl или любом другом языке, который я знаю)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...