Excluir elementos de una lista que están en otra matriz
Me gustaría crear una matriz como esta @exclude = ("[INFO] Reading file", "[INFO] All file(s) read");
que contiene elementos que me gustaría ignorar mientras recorro otra matriz.
La otra matriz es @nyuulog, en la que he preparado desde un archivo y se parece a esto:
[INFO] Uploading 37 article(s) from 3 file(s) totalling 23.98 MiB```
[INFO] Reading file 157.1.1.par2...
[INFO] Reading file 159.1.1.rar...
[INFO] Reading file 159.1.1.vol0+1.par2...
[INFO] All file(s) read...
[INFO] Finished uploading 23.98 MiB in 00:00:16.083 (1527.03 KiB/s). Raw upload: 2613.34 KiB/s
Entonces estoy usando esto:
foreach $line(@nyuulog) {print $txtfile("$line\n");}
que escribe todas las líneas, pero no quiero escribir líneas en el identificador de archivo que contiene un elemento en la matriz @exclude.
¿Hay una forma fácil de hacer esto? He intentado numerosos intentos de usar grep o el nuevo comando Perl ~~ (que no creo que se aplique en esta situación) y no puedo obtener la combinación correcta de comandos.
Cualquier ayuda o que me indique la dirección correcta será muy apreciada.
Gracias
Respuestas
Prueba esto:
my $FilterRe = join("|", map({"(^\Q$_\E)"} @exclude));
my @Filtered = grep({!/$FilterRe/} @nyuulog);
Inspirado por una pregunta sobre perlmonks .
Construya un hash de búsqueda para lo que se va a excluir y filtre la matriz con él
my %excl = map { $_ => 1 } @exclude; my @filtered = grep { not $excl{$_} } @original;
Esto es tan eficiente como puede ser el procesamiento de listas, O (N) , y con suerte, claro y fácil.
También puede tenerlo en un do
bloque para evitar una variable adicional ( %excl
) flotando
my @filtered = do {
my %excl = map { $_ => 1 } @exclude;
grep { not $excl{$_} } @original;
};