Esto se responde en la respuesta perlfaq4 al "How can I tell whether a certain element is contained in a list or array?".
Para buscar en perlfaq, puede buscar en la lista de todas las preguntas en perlfaq usando su navegador favorito.
Desde la línea de comandos, puede usar el modificador -q a perldoc para buscar palabras clave. Se podría haber encontrado su respuesta mediante la búsqueda de "lista":
perldoc -q list
(porciones de esta respuesta aportada por Anno Siegel y Brian D Foy)
oír la palabra "in" es una indicación que probablemente debiste haber usado un hash, no una lista o matriz, para almacenar tus datos. Los hashes están diseñados para responder a esta pregunta de manera rápida y eficiente. Las matrices no son
Dicho esto, hay varias maneras de abordar esto. En Perl 5.10 y posterior, puede utilizar el operador partido inteligente para comprobar que un artículo está contenido en una matriz o un hash:
use 5.010;
if($item ~~ @array)
{
say "The array contains $item"
}
if($item ~~ %hash)
{
say "The hash contains $item"
}
Con versiones anteriores de Perl, que tiene que hacer un poco más de trabajo. Si se va a realizar esta consulta muchas veces en los valores de cadena arbitrarias, la manera más rápida es, probablemente, para invertir la matriz original y mantener un hash cuyas claves son los valores de la primera matriz:
@blues = qw/azure cerulean teal turquoise lapis-lazuli/;
%is_blue =();
for (@blues) { $is_blue{$_} = 1 }
Ahora se puede comprobar si $ is_blue {$ some_color}. Podría haber sido una buena idea mantener el blues todo en un hash en primer lugar.
Si los valores son enteros pequeños, puede usar una matriz indexada simple. Este tipo de una matriz tendrá menos espacio:
@primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31);
@is_tiny_prime =();
for (@primes) { $is_tiny_prime[$_] = 1 }
# or simply @istiny_prime[@primes] = (1) x @primes;
Ahora compruebe si is_tiny_prime $ [$ some_number].
Si los valores en cuestión son números enteros en lugar de cadenas, se puede ahorrar un montón de espacio mediante el uso de cadenas de bits en su lugar:
@articles = (1..10, 150..2000, 2017);
undef $read;
for (@articles) { vec($read,$_,1) = 1 }
Ahora compruebe si vec ($ leer, $ n, 1) es cierto para algunos $ n.
Estos métodos garantizan pruebas individuales rápidas pero requieren una reorganización de la lista o matriz original. Solo pagan si tiene que probar varios valores con la misma matriz.
Si solo está probando una vez, el módulo estándar List :: Util exporta la función primero para este fin. Funciona deteniéndose una vez que encuentra el elemento. Está escrito en C para la velocidad, y su equivalente en Perl se parece a esta subrutina:
sub first (&@) {
my $code = shift;
foreach (@_) {
return $_ if &{$code}();
}
undef;
}
Si la velocidad es de poco interés, el lenguaje común utiliza grep en contexto escalar (que devuelve el número de elementos que transmiten su condición) atravesar la lista completa. Sin embargo, esto tiene el beneficio de decirle cuántas coincidencias encontró.
my $is_there = grep $_ eq $whatever, @array;
Si realmente desea extraer los elementos coincidentes, simplemente use grep en el contexto de la lista.
my @matches = grep $_ eq $whatever, @array;
no estoy seguro de que veo la cuestión de la dependencia con la lista :: Util. Es estándar con Perl y si lo usa con qw/first/(como lo hizo Draegtun), solo importa la única subrutina. – Telemachus
No es un problema per se, es más una preferencia personal. – MaxVT
No hay un problema de dependencia con la respuesta List :: Util. Si fuera yo, esa sería la respuesta aceptada. La falta de voluntad de usar módulos básicos me parece una preferencia arraigada en la superstición. En este caso, grep {} es casi igual de bueno. – singingfish