2010-09-13 17 views
28

Me gustaría representar un conjunto en Perl. Lo que suelo hacer es usar un hash con un poco de valor ficticio, por ejemplo .:¿Cómo puedo representar conjuntos en Perl?

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

A continuación, utilice if (defined $hash{$element_name}) para decidir si un elemento está en el conjunto.

¿Es esta una práctica común? Alguna sugerencia para mejorar esto?

Además, ¿debo usar defined o exists?

Gracias

Respuesta

10

Utilice uno de los muchos módulos establecidos en CPAN. A juzgar por su ejemplo, Set::Light o Set::Scalar parecen apropiados.


Puedo defender este consejo con los argumentos habituales pro CPAN (sin tener en cuenta los posibles efectos de sinergia).

  1. ¿Cómo podemos saber que la búsqueda es todo lo que se necesita, tanto ahora como en el futuro? La experiencia enseña que even the simplest programs expand and sprawl. Usar un módulo lo anticiparía.
  2. Una API es mucho más agradable para el mantenimiento, o personas que necesitan leer y comprender el código en general, que una implementación ad-hoc ya que permite pensar en problemas parciales en diferentes niveles de abstracción.
  3. Relacionado con eso, si resulta que la sobrecarga no es deseable, es fácil pasar de un módulo a uno simple eliminando indirecciones o reduciendo las estructuras de datos y el código fuente. Pero, por otro lado, si uno necesita más funciones, es moderadamente más difícil de lograr al revés.
  4. Los módulos de CPAN ya se probaron y hasta cierto punto se depuraron a fondo, quizás también la API experimentó pasos de mejora a lo largo del tiempo, mientras que con ad-hoc, programmers usually implement the first design that comes to mind.

Rara vez resulta que elegir un módulo al principio es una opción incorrecta.

+1

¿Hay algo que le brinde aparte de los gastos generales? Establecer operaciones o algo? Si todo lo que hago es verificar la existencia de un elemento en un conjunto, ¿por qué debería usar una biblioteca para hacer algo que el lenguaje ya hace increíblemente bien? –

+0

¿Alguna sugerencia sobre los módulos que admiten conjuntos de conjuntos? –

+0

Los conjuntos de conjuntos suenan como un trabajo para Set :: Object, cuyas instancias pueden anidar. – daxim

0

Así es como siempre lo he hecho. Yo tendería a usar exists en lugar de defined, pero ambos deberían funcionar en este contexto.

38

Sí, construir conjuntos de hash de esa manera es una expresión común. Tenga en cuenta que:

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

es preferible al uso de 1 como el valor porque undef ocupa mucho menos espacio. Esto también te obliga a utilizar exists (que es la opción correcta de todos modos).

+0

+1 Gracias. Consulte la pregunta relacionada sobre "conjuntos profundos": http://stackoverflow.com/questions/3700069/how-to-check-if-a-key-exists-in-a-deep-perl-hash –

Cuestiones relacionadas