Excluir elementos de una lista que están en otra matriz

Aug 20 2020

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

2 Light Aug 21 2020 at 03:06

Prueba esto:

my $FilterRe = join("|", map({"(^\Q$_\E)"} @exclude));
my @Filtered = grep({!/$FilterRe/} @nyuulog);

Inspirado por una pregunta sobre perlmonks .

3 zdim Aug 21 2020 at 04:59

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 dobloque para evitar una variable adicional ( %excl) flotando

my @filtered = do { 
    my %excl = map { $_ => 1 } @exclude;
    grep { not $excl{$_} } @original;
};