我怎么能在Perl循环中grep?

时间:2017-01-05 08:07:27

标签: regex perl grep

我正在尝试使用以下代码在Perl中grep

my @S = grep /M1A3B6/, @AR3; 
print @S;

但是,grep到循环没有返回任何值。

for(my $j=0; $j<$ln1; $j++){
    @S = grep /$AR1[$j]/, @AR3;
    $j++;
}
print @S;

示例文件如下:

@AR1
M1A3B6
M1AZ83

@AR3
>tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG
>tr|M1AP92|Uncharacterized protein >>MQTLSRAQSQ
>tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF

我们将不胜感激。

3 个答案:

答案 0 :(得分:7)

您发布的代码的结构存在一些重大问题:

  1. 您在每次迭代中递增$j两次(一次使用$j++语句中的for,然后是循环体中的另一个$j++ )。这将导致它跳过@AR1中的所有其他元素。因为使用C风格的循环很容易犯这样的错误,所以当你使用for (@list)代替C风格for (;;)时通常会更好只是迭代一个项目列表。
  2. 您在循环的每次迭代中直接分配给@S,这会将任何现有内容替换为新的grep结果。这意味着,在循环结束时,@S仅包含在最后一次迭代中找到的结果,而不是整个过程中找到的所有结果。您需要附加到@S
  3. 始终 use strict;use warnings;。是的,习惯他们并满足他们的要求可能是一个小麻烦,但是在调试的时候他们是你最好的朋友。
  4. 在这里,我将如何处理您发布的代码似乎意图:

    #!/usr/bin/env perl    
    
    use strict;
    use warnings;
    use 5.010;
    
    my @ar1 = qw( M1A3B6 M1AZ83 );
    my @ar3 = (
      '>tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG',
      '>tr|M1AP92|Uncharacterized protein >>MQTLSRAQSQ',
      '>tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF'
    );
    
    my @s;
    for my $key (@ar1) {
      push @s, (grep /$key/, @ar3);
    } 
    
    say for @s;
    

    结果输出:

    >tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG
    >tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF
    

答案 1 :(得分:1)

我同意Dave Sherohman,但我想强调更简洁的语法:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

my @ar1 = qw( M1A3B6 M1AZ83 );
my @ar3 = (
  '>tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG',
  '>tr|M1AP92|Uncharacterized protein >>MQTLSRAQSQ',
  '>tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF'
);

my @s = map {my $key = $_;grep /$key/, @ar3} @ar1;

say for @s;

这使用了以下事实:map的块部分在列表上下文中进行计算,并且可以在返回值中生成零个,一个或多个元素。当我们想要连接所有输出时,这非常适合与grep结合。

答案 2 :(得分:0)

尝试如下所述的内容,使用|加入数组然后grep它。

my @ar1 = qw(M1A3B6 M1AZ83);
my @ar3 = (
  '>tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG',
  '>tr|M1AP92|Uncharacterized protein >>MQTLSRAQSQ',
  '>tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF'
);

my $pattern = join("|",@ar1);
my @data = grep{ /$pattern/ } @ar3;
print "@data\n";