Как я могу представить наборы в Perl? - PullRequest
32 голосов
/ 13 сентября 2010

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

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

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

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

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

Спасибо

Ответы [ 3 ]

46 голосов
/ 13 сентября 2010

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

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

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

14 голосов
/ 13 сентября 2010

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


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

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

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

1 голос
/ 13 сентября 2010

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

...