Проверьте слова и синонимы
У меня есть массив с некоторыми словами, а другой массив со словами и синонимами. Я хотел бы создать третий массив, когда я найду подходящее слово между первым и вторым массивом. Я попытался с помощью 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"? Я не могу написать правильный синтаксис для решения проблемы.. Спасибо
2 ответа
Вы можете создать регулярное выражение из массива1, а затем отфильтровать массив2, используя его:
#!/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;
Я знаю, что у вас есть ответ, но вот забавный способ, о котором я думал.
Итак, я думаю, что это похоже на перевернутый индекс.
Вы берете каждый набор синонимов и превращаете их в массив. Затем возьмите каждый элемент этого массива и поместите его в хеш в качестве ключей со значением, являющимся ссылкой на массив.
#!/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);
РЕДАКТИРОВАТЬ: пропустил, кроме ответа раньше, этот должен быть полным.