Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将array1中的元素部分与array2中的元素进行匹配?_Arrays_Perl_Element_Matching - Fatal编程技术网

Arrays 如何将array1中的元素部分与array2中的元素进行匹配?

Arrays 如何将array1中的元素部分与array2中的元素进行匹配?,arrays,perl,element,matching,Arrays,Perl,Element,Matching,我有一个关于匹配数组元素部分的问题 我有两个阵列: @1=SMITH SMIT MITH SMI MIT ITH(史密斯姓氏的一部分) @2=150000个姓氏的列表 我需要在@2中搜索@1中的元素,然后打印@2中匹配的全部姓氏 例如: 如果SMITHERS在@2:中,则打印“SMITHERS”(因为SMITH、SMIT、MITH、SMI、MIT、ITH匹配) 如果MITCHELL在@2:print“MITCHELL”(因为MIT匹配) 如果SCHMITTY在@2:print中,则打印“SCHM

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

我有两个阵列:

@1=SMITH SMIT MITH SMI MIT ITH(史密斯姓氏的一部分)

@2=150000个姓氏的列表

我需要在@2中搜索@1中的元素,然后打印@2中匹配的全部姓氏

例如:

如果SMITHERS在@2:中,则打印“SMITHERS”(因为SMITH、SMIT、MITH、SMI、MIT、ITH匹配)

如果MITCHELL在@2:print“MITCHELL”(因为MIT匹配)

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


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

您使用的是什么编程语言?@shmiddy啊,对不起,Perl@ikegami-为什么不使用,因为它从
@a1
创建以下模式:
(?^:(?:SMI(?:TH?)| MITH?| ITH))
?@Kenosis,因为两个受支持的Perl版本(5.14和5.16)之前的两个版本(5.10和5.12)已经做到了!请参见
perl-Mre=debug-e'qr/foo | fudge | bar | mooo/'
@Kenosis中的“TRIE”,另外,Regexp::Assemble用于模式的交替。列表用于字符串的交替。不必对后者使用quotemeta。@ikegami-也许我不明白。您的代码生成的模式如下:
(?^u:SMITH | SMIT | MIT | MIT | ITH)
,而Regexp::assembly生成:
(?^:(?:SMI | TH?| MITH | ITH))
@kenosis,
SMIT | MIT | MIT
编译为
SMI | ITH | MITH?/code>。同样,请参见生成的正则表达式代码中的“TRIE”。它现在内置于正则表达式引擎本身。
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/;
}
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/;
}