1

我有一个关于匹配数组元素部分的问题。

我有两个数组:

@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”(因为 MIT 匹配)

如果 SCHMITTY 在 @2 中:打印“SCHMITTY”(因为 MIT 匹配)

如果 JONES 在 @2: 空白(因为没有匹配项)

4

1 回答 1

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/;
}
于 2012-09-14T22:45:18.730 回答