ไม่รวมองค์ประกอบของรายการที่อยู่ในอาร์เรย์อื่น

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");}

ซึ่งเขียนทุกบรรทัด แต่ฉันไม่ต้องการเขียนบรรทัดไปยัง filehandle ที่มีองค์ประกอบในอาร์เรย์ @exclude

มีวิธีง่ายๆในการทำเช่นนี้หรือไม่? ฉันพยายามหลายครั้งในการใช้ grep หรือคำสั่ง Perl ~~ ใหม่ (ซึ่งฉันไม่คิดว่าจะใช้ได้ในสถานการณ์นี้) และไม่สามารถรับชุดคำสั่งที่เหมาะสม

ความช่วยเหลือใด ๆ หรือชี้ให้ฉันไปในทิศทางที่ถูกต้อง - จะได้รับการชื่นชมอย่างมาก

ขอขอบคุณ

คำตอบ

2 Light Aug 21 2020 at 03:06

ลองสิ่งนี้:

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

แรงบันดาลใจจากคำถามเกี่ยวกับ Perlmonks

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;
};