Исключить элементы списка, находящиеся в другом массиве

Aug 20 2020

Я хотел бы создать такой массив, @exclude = ("[INFO] Reading file", "[INFO] All file(s) read");который содержит элементы, которые я хотел бы игнорировать при просмотре другого массива

Другой массив - это @nyuulog, который я приготовил из файла и выглядит примерно так:

[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

Итак, я использую это:

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

который записывает все строки, но я не хочу, чтобы строки выводились в дескриптор файла, содержащий элемент в массиве @exclude.

Есть простой способ сделать это? Я пробовал множество попыток использовать grep или новую команду Perl ~~ (которая, я не думаю, применима в этой ситуации), и не могу получить правильную комбинацию команд.

Любая помощь или указание мне в правильном направлении - были бы очень признательны.

Спасибо

Ответы

2 Light Aug 21 2020 at 03:06

Попробуй это:

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

Вдохновленный вопросом о перлмонках .

3 zdim Aug 21 2020 at 04:59

Создайте поисковый хэш для того, что нужно исключить, и отфильтруйте с его помощью массив

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

Это примерно так же эффективно, как обработка списков, O (N) , и, надеюсь, понятно и легко.

Также может быть в doблоке, чтобы избежать %exclплавающей вокруг дополнительной переменной ( )

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