Проверьте слова и синонимы

У меня есть массив с некоторыми словами, а другой массив со словами и синонимами. Я хотел бы создать третий массив, когда я найду подходящее слово между первым и вторым массивом. Я попытался с помощью 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);

РЕДАКТИРОВАТЬ: пропустил, кроме ответа раньше, этот должен быть полным.

Другие вопросы по тегам