4

キーワード リストとブラックリストがあります。ブラックリストの項目を含むすべてのキーワードを削除したい。現時点では、私はこのようにしています:

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

現時点では、約 2,500 万のキーワードと数百の単語がブラックリストに登録されているため、これを行う最速の方法はないかと考えていました。

4

3 に答える 3

4

最も簡単なオプションはjoin、ブラックリストのエントリを 1 つの正規表現にまとめてから、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
于 2013-05-24T09:42:09.493 に答える
3

my @blacklist = ( qr/bad/i )ネストされたループを維持したい場合は、検索をプリコンパイルすると役立つ場合があります。

my @blacklist = ( 'bad', 'awful', 'worst' )または、 からに変更してからmy $blacklist = qr/bad|awful|worst/;、内側のループを に置き換えますif ( $keywords[$i] =~ $blacklist ) ...

于 2013-05-24T09:39:51.410 に答える
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);
}
于 2013-05-24T09:32:48.163 に答える