Esclude gli elementi di un elenco che si trovano in un altro array

Aug 20 2020

Vorrei creare un array come questo @exclude = ("[INFO] Reading file", "[INFO] All file(s) read");che contiene elementi che vorrei ignorare durante il ciclo di un altro array

L'altro array è @nyuulog che ho pronto da un file e ha un aspetto simile a questo:

[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

Quindi sto usando questo:

foreach $line(@nyuulog) {print $txtfile("$line\n");}

che scrive tutte le righe ma non voglio scrivere righe nel filehandle che contiene un elemento nell'array @exclude.

C'è un modo semplice per farlo? Ho provato numerosi tentativi di utilizzare grep o il nuovo comando Perl ~~ (che non credo si applichi in questa situazione) e non riesco a ottenere la giusta combinazione di comandi.

Qualsiasi aiuto o indicandomi nella giusta direzione sarebbe molto apprezzato.

Grazie

Risposte

2 Light Aug 21 2020 at 03:06

Prova questo:

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

Ispirato da una domanda su Perlmonks .

3 zdim Aug 21 2020 at 04:59

Costruisci un hash di ricerca per ciò che deve essere escluso e filtra l'array con esso

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

Questo è efficiente quanto l'elaborazione delle liste può essere, O (N) , e si spera chiaro e facile.

Può anche averlo in un doblocco per evitare che una variabile extra ( %excl) fluttui intorno

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