Найдите элементы первого массива во втором массиве и добавьте строки, совпадающие со строками элементов первого массива

У меня есть два массива. У одного из них есть только строки, а у другого есть строки, соответствующие строкам в случайных местах. Как можно сопоставить совпавшие строки второго массива с элементами первого массива? INPUT_1:

cpu
soc
disk
mobile
processor
etc..

Вход 2:

The cpu does all the important processings in a system.
It needs to be improved for processing.
There is also an SoC which does all the processing in a chip.
I think you know well about that.
Now,let us focus on someother thing.
Mobile is one of the world's famous electronic device.
Its impact on growing technology is tremendous.

Это мои два входа. Оба из них хранятся в разных массивах. Теперь я должен grep только те строки в input2, которые содержат элементы input1. Я пытался использовать код, но пока grep, он дает мне все строки, но не совпадает.

open(MYFILE,"+<$input_1");
open(MYFILE2,"+<$input_2");
open(WRITE,">wr");

@tap= <MYFILE>;
@sig=<MYFILE2>;

@out=' ';
$count=$#tap;

foreach $i(0 .. $count){
    @out = grep(/$tap[$i]/, @sig);

    print WRITE @out;
}

Я не знаю, почему я не могу вывести из второго массива? Пожалуйста, помогите мне.

2 ответа

Ваш вход один (@tap) содержит переносы строк. Вот почему у вас нет совпадений. Вам нужно chomp каждая строка после ее прочтения удаляет разрывы строк.

@tap = <MYFILE>;
chomp @tap;

Взгляните на это:

use Data::Dumper;

my @tap = <DATA>;
print Dumper \@tap;

__DATA__
cpu
soc
disk

Это выводит:

$VAR1 = [
          'cpu
',
          'soc
',
          'disk
'
        ];

Если вы добавите chomp @tap вместо этого вы получите следующее. Новые строки исчезли, и шаблоны будут совпадать.

$VAR1 = [
          'cpu',
          'soc',
          'disk'
        ];

Можно немного упростить ваш код, объединив все ваши соответствия регулярному выражению в одно. Вы также можете исключить много ваших промежуточных переменных.

open my $fh1, '<', $input_1 or die $!;
open my $fh2, '<', $input_2 or die $!;
open my $out_fh, '>', 'wr'  or die $!;

chomp(my @tap = <$fh1>);

my $re = join '|', @tap;  

print $out_fh grep /$re/i, <$fh2>;

Примечание: я также добавил /i опция для оператора матча. Это означает, что две строки, которые включают "SoC" и "Mobile", также будут совпадать.

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