我有一个关键字列表和一个黑名单。 我想删除包含任何黑名单项的所有关键字。 目前我这样做:
my @keywords = ( 'some good keyword', 'some other good keyword', 'some bad keyword');
my @blacklist = ( 'bad' );
A: for my $keyword ( @keywords ) {
B: for my $bl ( @blacklist ) {
next A if $keyword =~ /$bl/i; # omitting $keyword
}
# some keyword cleaning (for instance: erasing non a-zA-Z0-9 characters, etc)
}
我想知道是否有任何最快的方法可以做到这一点,因为目前我有大约25万个关键词和黑名单中的几个hundrets词。
答案 0 :(得分:4)
最直接的选择是将join
黑名单条目合并为一个正则表达式,然后grep
将那些与该正则表达式不匹配的关键字列表:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
my @keywords =
('some good keyword', 'some other good keyword', 'some bad keyword');
my @blacklist = ('bad');
my $re = join '|', @blacklist;
my @good = grep { $_ !~ /$re/ } @keywords;
say join "\n", @good;
输出:
some good keyword
some other good keyword
答案 1 :(得分:3)
如果要保留嵌套循环,预编译搜索可能有助于my @blacklist = ( qr/bad/i )
。
或者,从my @blacklist = ( 'bad', 'awful', 'worst' )
更改为my $blacklist = qr/bad|awful|worst/;
,然后使用if ( $keywords[$i] =~ $blacklist ) ...
替换内部循环。
答案 2 :(得分:0)
这应该这样做:
my @indices;
for my $i (0..$#keywords) {
for my $bl (@blacklist) {
if ($keywords[$i] =~ $bl) {
push(@indices, $i);
last;
}
}
}
for my $i (@indices) {
@keywords = splice(@keywords, $i);
}