arrays - 是字符串中包含的任何数组项

标签 arrays string perl contain

我有一个关键字列表和一个黑名单。
我想删除包含任何黑名单项目的所有关键字。
目前我这样做:

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

我想知道有没有最快的方法来做到这一点,因为目前我在黑名单中有大约 2500 万个关键字和几个单词。

最佳答案

最直接的选择是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

关于arrays - 是字符串中包含的任何数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16731451/

相关文章:

mysql - 无法在 Perl 中使用 DBI 在 mysql 中插入变音符号文本的等效纯文本

perl - 哈希生成脚本上的Perl语法错误

arrays - 检查数组是否有值

javascript - 根据 attr 按类选择元素,然后添加或删除类

python - 将数据帧转换为记录数组(并将对象转换为字符串)

javascript - 为什么 string.match(...)[0] 会抛出异常?

perl - 使用 perlbrew 和 cpm 安装模块 - perlbrew 开关在 docker 构建期间不会更改 @INC

arrays - 从两个 slice 的重复项创建一个 slice

java - String 的 replaceAll() 方法和转义字符

Android字符串占位符不同的语言