web-dev-qa-db-fra.com

Comment puis-je représenter des ensembles en Perl?

Je voudrais représenter un ensemble en Perl. Ce que je fais habituellement, c'est utiliser un hachage avec une valeur fictive, par exemple:

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

Ensuite, utilisez if (defined $hash{$element_name}) pour décider si un élément est dans l'ensemble.

Est-ce une pratique courante? Des suggestions pour améliorer cela?

Aussi, dois-je utiliser defined ou exists?

Je vous remercie

36
David B

Utilisez l'un des nombreux modules Set sur CPAN. À en juger par votre exemple, Set::Light ou Set::Scalar semblent appropriés.


Je peux défendre ce conseil avec les arguments habituels pro CPAN (sans tenir compte des éventuels effets de synergie).

  1. Comment pouvons-nous savoir que la recherche est tout ce dont nous avons besoin, maintenant et à l'avenir? L'expérience enseigne que même les programmes les plus simples s'étendent et s'étendent . L'utilisation d'un module permettrait d'anticiper cela.
  2. Une API est beaucoup plus agréable pour la maintenance, ou pour les personnes qui ont besoin de lire et de comprendre le code en général, qu'une implémentation ad hoc car elle permet de réfléchir à des problèmes partiels à différents niveaux d'abstraction.
  3. Lié à cela, s'il s'avère que la surcharge n'est pas souhaitable, il est facile de passer d'un module à un simple en supprimant les indirections ou en couplant les structures de données et le code source. Mais d'un autre côté, si l'on avait besoin de plus de fonctionnalités, il est modérément plus difficile de réaliser l'inverse.
  4. Les modules CPAN sont déjà testés et dans une certaine mesure complètement débogués, peut-être aussi l'API a-t-elle subi des étapes d'amélioration au fil du temps, alors qu'avec ad-hoc, les programmeurs implémentent généralement la première conception qui leur vient à l'esprit .

Il s'avère rarement que choisir un module au début est un mauvais choix.

14
daxim

Oui, créer des ensembles de hachage de cette manière est une expression courante. Notez que:

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

est préférable à l'utilisation de 1 comme valeur car undef occupe beaucoup moins d'espace. Cela vous oblige également à utiliser exists (ce qui est de toute façon le bon choix).

49
Chas. Owens

C'est comme ça que je l'ai toujours fait. J'aurais tendance à utiliser exists plutôt que defined mais ils devraient tous les deux fonctionner dans ce contexte.

1
Stephen Darlington