¿Cómo puedo comprobar si una matriz Perl contiene un valor particular?
Estoy tratando de encontrar una manera de verificar la existencia de un valor en una matriz sin iterar a través de la matriz.
Estoy leyendo un archivo para un parámetro. Tengo una larga lista de parámetros con los que no quiero tratar. Coloqué estos parámetros no deseados en una matriz@badparams
.
Quiero leer un nuevo parámetro y si no existe en @badparams
procesarlo. Si existe en @badparams
, pase a la siguiente lectura.
Mejor propósito general: matrices especialmente cortas (1000 elementos o menos) y codificadores que no están seguros de qué optimizaciones se adaptan mejor a sus necesidades.
# $value can be any regex. be safe
if ( grep( /^$value$/, @array ) ) {
print "found it";
}
Se ha mencionado que grep pasa por todos los valores incluso si el primer valor de la matriz coincide. Esto es cierto, sin embargo, grep sigue siendo extremadamente rápido en la mayoría de los casos . Si estás hablando de matrices cortas (menos de 1000 elementos), la mayoría de los algoritmos serán bastante rápidos de todos modos. Si está hablando de matrices muy largas (1.000.000 de elementos), grep es aceptablemente rápido independientemente de si el elemento es el primero, el medio o el último de la matriz.
Casos de optimización para arreglos más largos:
Si su matriz está ordenada , utilice una "búsqueda binaria".
Si se busca repetidamente la misma matriz muchas veces, cópiela primero en un hash y luego verifique el hash. Si le preocupa la memoria, mueva cada elemento de la matriz al hash. Más memoria eficiente pero destruye la matriz original.
Si se buscan los mismos valores repetidamente dentro de la matriz, cree un caché de forma perezosa. (A medida que se busca cada elemento, primero verifique si el resultado de la búsqueda se almacenó en un hash persistente. Si el resultado de la búsqueda no se encuentra en el hash, busque en la matriz y coloque el resultado en el hash persistente para que la próxima vez búsquelo en el hash y omita la búsqueda).
Nota: estas optimizaciones solo serán más rápidas cuando se trate de matrices largas. No optimice demasiado.
Simplemente convierta la matriz en un hash:
my %params = map { $_ => 1 } @badparams;
if(exists($params{$someparam})) { ... }
También puedes agregar más parámetros (únicos) a la lista:
$params{$newparam} = 1;
Y luego obtenga una lista de parámetros (únicos):
@badparams = keys %params;
Puede utilizar la función Smartmatch en Perl 5.10 de la siguiente manera:
Para una búsqueda de valores literales, hacer lo siguiente será suficiente.
if ( "value" ~~ @array )
Para la búsqueda escalar, hacer lo siguiente funcionará como se indica arriba.
if ($val ~~ @array)
Para la matriz en línea que se hace a continuación, funcionará como se indica arriba.
if ( $var ~~ ['bar', 'value', 'foo'] )
En Perl 5.18, smartmatch está marcado como experimental, por lo tanto, debe desactivar las advertencias activando pragma experimental agregando lo siguiente a su script/módulo:
use experimental 'smartmatch';
Alternativamente, si desea evitar el uso de smartmatch, entonces, como dijo Aaron, use:
if ( grep( /^$value$/, @array ) ) {
#TODO:
}