2010-09-13 15 views
28

Chciałbym reprezentować zestaw w Perlu. Co zwykle zrobić to za pomocą mieszania z jakiegoś manekina wartości, np .:Jak mogę reprezentować zestawy w Perlu?

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

Następnie użyj if (defined $hash{$element_name}) zdecydować, czy element jest w zestawie.

Czy to powszechna praktyka? Wszelkie sugestie dotyczące poprawy tego?

Czy powinienem również używać defined lub exists?

Dziękuję

Odpowiedz

10

użyć jednego z wielu modułów Ustaw na CPAN. Sądząc po twoim przykładzie, Set::Light lub Set::Scalar wydają się odpowiednie.


Mogę bronić tej rady zwykłymi argumentami pro CPAN (pomijając możliwe efekty synergii).

  1. Skąd możemy wiedzieć, że szukanie jest wszystkim, co jest potrzebne, zarówno teraz, jak i w przyszłości? Doświadczenie uczy, że even the simplest programs expand and sprawl. Używanie modułu przewidywałoby to.
  2. Interfejs API jest o wiele przyjemniejszy w utrzymaniu lub ludzi, którzy muszą przeczytać i zrozumieć ogólnie kod, niż implementację ad-hoc, ponieważ pozwala myśleć o częściowych problemach na różnych poziomach abstrakcji.
  3. W związku z tym, jeśli okaże się, że narzut jest niepożądany, łatwo jest przejść z modułu do prostej przez usunięcie pośrednich lub parowanie struktur danych i kodu źródłowego. Z drugiej jednak strony, jeśli ktoś potrzebuje więcej funkcji, jest o wiele trudniej osiągnąć odwrotnie.
  4. Moduły CPAN są już testowane i do pewnego stopnia dokładnie debugowane, być może również API przeszło etapy poprawy w czasie, podczas gdy z ad-hoc, programmers usually implement the first design that comes to mind.

Rzadko się okazuje, że wybór modułu na początku jest złym wyborem.

+1

Czy jest coś, co daje ci coś innego niż obciążenie ogólne? Ustaw operacje czy coś? Jeśli wszystko, co robię, polega na sprawdzeniu istnienia elementu w zestawie, dlaczego miałbym używać biblioteki do robienia czegoś, co język już niewiarygodnie działa? –

+0

Jakieś sugestie dotyczące modułów obsługujących zestawy zestawów? –

+0

Zestawy zestawów brzmią jak zadanie dla zestawu :: Obiekt, którego instancje mogą zagnieżdżać. – daxim

0

Tak zawsze to robiłem. Zwykle używam exists zamiast defined, ale oba powinny działać w tym kontekście.

38

Tak, budowanie zestawów skrótów w ten sposób jest pospolitym idiomem. Należy pamiętać, że:

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

jest korzystniejsze 1 jako wartość, ponieważ undef zajmuje znacznie mniej miejsca. To również zmusza do użycia exists (co i tak jest właściwym wyborem).

+0

+1 Dzięki. Zobacz powiązane pytanie dotyczące "deep sets": http://stackoverflow.com/questions/3700069/how-to-check-if-a-key-exists-in-a-deep-perl-hash –

Powiązane problemy