如何解决排除另一个数组中的列表元素
我想创建一个这样的数组
@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 ~~命令(在这种情况下不适用),并且无法获得正确的命令组合。
任何帮助或为我指明正确的方向-将不胜感激。
谢谢
解决方法
为要排除的内容构造一个查找哈希,并使用它过滤数组
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;
};
,
尝试一下:
my $FilterRe = join("|",map({"(^\Q$_\E)"} @exclude));
my @Filtered = grep({!/$FilterRe/} @nyuulog);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。