我有一个关于匹配数组元素部分的问题。
我有两个数组:
@ 1 = SMITH SMIT MITH SMI MIT ITH(姓SMITH的部分)
@ 2 = 150,000个姓氏的列表
我需要在@ 2中搜索@ 1中的元素,然后从@ 2打印整个匹配的姓氏。
例如:
如果SMITHERS在@ 2中:打印“SMITHERS”(因为SMITH,SMIT,MITH,SMI,MIT,ITH匹配)
如果MITCHELL在@ 2中:打印“MITCHELL”(因为麻省理工学院匹配)
如果SCHMITTY在@ 2中:打印“SCHMITTY”(因为麻省理工学院匹配)
如果JONES在@ 2中:空白(因为没有匹配)
答案 0 :(得分:2)
use feature qw( say );
my @a1 = qw( SMITH SMIT MITH SMI MIT ITH );
my @a2 = qw( SMITHERS MITCHELL SCHMITTY JONES );
my $pat =
join '|',
map quotemeta,
sort { length($b) <=> length($a) }
@a1;
my $re = qr/$pat/;
for (@a2) {
say if /$re/;
}
顺便说一句,可以按如下方式创建足够准确的@a1
:
use feature qw( say );
my $a1 = 'SMITH';
my @a2 = qw( SMITHERS MITCHELL SCHMITTY JONES );
my $pat =
join '|',
map quotemeta,
$a1 =~ /(?=(...))./sg;
my $re = qr/$pat/;
for (@a2) {
say if /$re/;
}