Perl: объявление списка значений как константы - PullRequest
3 голосов
/ 19 октября 2011

Я использовал прагму [constant], и у меня есть быстрый вопрос о том, как я могу объявить список констант:

use constant {
   LIST_ONE   => qw(this that the other),    #BAD
   LIST_TWO   => ("that", "this", "these", "some of them"),   #BAR
   LIST_THREE => ["these", "those", "and thems"],   #WORKS
};

Проблема с последним в том, что он создает ссылкусписок:

use constant {
   LIST_THREE => ["these", "those", "and thems"],
};

# Way 1: A bit wordy and confusing

my $arrayRef = LIST_THREE;
my @array = @{$arrayRef};

foreach my $item (@array) {
   say qq(Item = "$item");
}

# Way 2: Just plain ugly
foreach my $item (@{&LIST_THREE}) {

   say qq(Item = "$item");
}

Это работает, но уродливо.

Есть ли лучший способ создания постоянного списка?

Я понимаю, что константы - это действительно дешевый способ создания подпрограммы, которая возвращает значение константы.Но подпрограммы также могут возвращать список.

Каков наилучший способ объявления списка констант?

Ответы [ 3 ]

5 голосов
/ 19 октября 2011

Согласно документации , если вы сделаете:

use constant DAYS => qw( Sunday Monday Tuesday Wednesday Thursday Friday Saturday);

... тогда вы можете сделать:

my @workdays = (DAYS)[1..5];

Я бы сказал, что это лучшечем два способа обращения к константным спискам, которые вы описали.

1 голос
/ 19 октября 2011

Прагма constant - это просто синтаксический сахар для объявления подпрограммы во время компиляции.Вы можете сделать более или менее то же самое с подпрограммой, которая возвращает список с чем-то вроде:

BEGIN {
    *LIST_ONE = sub () { qw(this that the other) }
}

И тогда вы можете сказать

@list = LIST_ONE;
$element = (LIST_ONE)[1];
0 голосов
/ 10 февраля 2012

Если вам нужен постоянный массив, я бы рекомендовал использовать Const :: Fast , который позволяет объявлять постоянные скаляры, хэши и массивы.

Я проверил все различные модули CPAN для объявления констант: http://neilb.org/reviews/constants.html.

Neil

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