Kecualikan elemen daftar yang ada di larik lain

Aug 20 2020

Saya ingin membuat array seperti ini @exclude = ("[INFO] Reading file", "[INFO] All file(s) read");yang berisi item yang ingin saya abaikan saat mengulang melalui array lain

Array lainnya adalah @nyuulog yang telah saya siapkan dari sebuah file dan terlihat seperti ini:

[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

Jadi saya menggunakan ini:

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

yang menulis semua baris tetapi saya tidak ingin menulis baris ke filehandle yang berisi elemen dalam array @exclude.

Adakah cara mudah untuk melakukan ini? Saya telah mencoba beberapa kali menggunakan grep atau perintah Perl ~~ yang baru (yang menurut saya tidak berlaku dalam situasi ini) dan tidak bisa mendapatkan kombinasi perintah yang tepat.

Setiap bantuan atau mengarahkan saya ke arah yang benar - akan sangat dihargai.

Terima kasih

Jawaban

2 Light Aug 21 2020 at 03:06

Coba ini:

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

Terinspirasi oleh pertanyaan tentang perlmonks .

3 zdim Aug 21 2020 at 04:59

Buat hash pencarian untuk apa yang akan dikecualikan, dan filter array dengannya

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

Ini seefisien mungkin pemrosesan daftar, O (N) , dan mudah-mudahan jelas dan mudah.

Bisa juga memilikinya di doblok untuk menghindari variabel ekstra ( %excl) mengambang

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