我有一个包含一些单词的数组,另一个包含单词和同义词的数组。当我在第一个和第二个数组之间找到匹配字时,我想创建第三个数组。我尝试使用grep但是我无法以正确的方式编写代码以获得我想要的内容。 问题是数组1中的元素可以在开头的数组2中找到,也可以在结尾或中间找到。
例如,使用例子可能会更容易:
@array1 = qw(chose, abstraction);
@array2 = (
"inspirer respirer",
"incapable",
"abstraction",
"abaxial",
"cause,chose,objet",
"ventral",
"chose,objet"
);
结果应该是
@array3 = ("abstraction", "cause,chose,objet", "chose,objet");
使用" grep"是否正确? 我无法编写正确的语法来解决问题。 谢谢
答案 0 :(得分:1)
您可以从array1构造正则表达式,然后使用它过滤array2:
#!/usr/bin/perl
use warnings;
use strict;
my @array1 = qw(chose, abstraction);
my @array2 = (
"inspirer respirer",
"incapable",
"abstraction",
"abaxial",
"cause,chose,objet",
"ventral",
"chose,objet"
);
my $regex = join '|', map quotemeta $_, @array1; # quotemeta needed for special characters.
$regex = qr/$regex/;
my @array3 = grep /$regex/, @array2;
print "$_\n" for @array3;
答案 1 :(得分:1)
我知道你有答案,但这是我想到的一种有趣的方式。
所以,我猜它就像一个倒排索引。
您获取每组同义词并将它们组成一个数组。然后获取该数组的每个元素并将其作为键作为键,将值作为对数组的引用。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @array1 = qw(chose abstraction);
my @array2 = ("inspirer respirer",
"incapable",
"abstraction",
"abaxial",
"cause,chose,objet",
"ventral",
"chose,objet"
);
my @array;
push @array, map { /,|\s/ ? [split(/,|\s/, $_)]:[$_] } @array2;
my %construct;
while(my $array_ref = shift(@array)){
for(@{ $array_ref }){
push @{ $construct{$_} }, $array_ref;
}
}
my @array3 = map { s/,//; (@{ $construct{$_} }) } @array1;
print join(', ', @{ $_ }), "\n" for (@array3);
编辑: 之前错过了答案,这个应该是完整的。