在第二个数组中找到第一个数组的元素,并grep与第一个数组元素匹配的行

时间:2016-11-04 11:23:20

标签: regex perl perl-data-structures

我有两个数组。其中一个只有字符串,另一个在随机位置有匹配字符串的行。如何用第一个数组的元素grep第二个数组的匹配行? 的 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 个答案:

答案 0 :(得分: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'
        ];

答案 1 :(得分:0)

通过将所有正则表达式匹配合并为一个,可以略微简化您的代码。你也可以消除很多中间变量。

<server>
  <id>github.com</id>
  <username>idelvall</username>
  <password>${github-token}</password>
</server>

注意:我还在匹配运算符中添加了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>; 选项。这意味着包含&#34; SoC&#34;和&#34;移动&#34;也会匹配。