Esclude gli elementi di un elenco che si trovano in un altro array
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
Prova questo:
my $FilterRe = join("|", map({"(^\Q$_\E)"} @exclude));
my @Filtered = grep({!/$FilterRe/} @nyuulog);
Ispirato da una domanda su Perlmonks .
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 do
blocco per evitare che una variabile extra ( %excl
) fluttui intorno
my @filtered = do {
my %excl = map { $_ => 1 } @exclude;
grep { not $excl{$_} } @original;
};