Подтвердить что ты не робот

Как я могу представить наборы в Perl?

Я хотел бы представить набор в Perl. Обычно я использую хэш с некоторым фиктивным значением, например:

my %hash=();
$hash{"element1"}=1;
$hash{"element5"}=1;

Затем используйте if (defined $hash{$element_name}), чтобы определить, находится ли элемент в наборе.

Это обычная практика? Любые предложения по улучшению этого?

Кроме того, следует ли использовать defined или exists?

Спасибо

4b9b3361

Ответ 1

Используйте один из множества модулей Set на CPAN. Судя по вашему примеру, Set::Light или Set::Scalar кажутся подходящими.


Я могу защитить этот совет с помощью обычных аргументов pro CPAN (без учета возможных синергетических эффектов).

  • Как мы можем знать, что поиск - это все, что необходимо, как сейчас, так и в будущем? Опыт учит, что даже самые простые программы расширяются и расширяются. Использование модуля предвидит это.
  • API намного удобнее для обслуживания или людей, которым необходимо читать и понимать код в целом, чем специальная реализация, поскольку позволяет думать о частичных проблемах на разных уровнях абстракции.
  • В связи с этим, если выясняется, что накладные расходы нежелательны, легко перейти от модуля к простому, удалив указатели или парирующие структуры данных и исходный код. Но, с другой стороны, если потребуется больше возможностей, то в среднесрочной перспективе добиться большего будет наоборот.
  • Модули CPAN уже протестированы и в какой-то степени полностью отлажены, возможно, API также прошел шаг за шагом, тогда как с ad-hoc, программисты обычно реализуют первый дизайн, который приходит на ум.

Редко получается, что выбор модуля в начале является неправильным выбором.

Ответ 2

Да, построение хеш-наборов - это обычная идиома. Обратите внимание:

my @keys = qw/a b c d/;
my %hash;
@hash{@keys} = ();

предпочтительнее использовать 1 в качестве значения, поскольку undef занимает значительно меньше места. Это также заставляет вас использовать exists (это правильный выбор).

Ответ 3

Как я всегда это делал. Я хотел бы использовать exists, а не defined, но они должны работать в этом контексте.