ไม่รวมองค์ประกอบของรายการที่อยู่ในอาร์เรย์อื่น
ฉันต้องการสร้างอาร์เรย์แบบนี้@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 ~~ ใหม่ (ซึ่งฉันไม่คิดว่าจะใช้ได้ในสถานการณ์นี้) และไม่สามารถรับชุดคำสั่งที่เหมาะสม
ความช่วยเหลือใด ๆ หรือชี้ให้ฉันไปในทิศทางที่ถูกต้อง - จะได้รับการชื่นชมอย่างมาก
ขอขอบคุณ
คำตอบ
ลองสิ่งนี้:
my $FilterRe = join("|", map({"(^\Q$_\E)"} @exclude));
my @Filtered = grep({!/$FilterRe/} @nyuulog);
แรงบันดาลใจจากคำถามเกี่ยวกับ Perlmonks
สร้างแฮชการค้นหาสำหรับสิ่งที่จะยกเว้นและกรองอาร์เรย์ด้วย
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;
};