我怎么能在Perl循环中grep?

Vin*_*nay 1 regex perl grep

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

my @S = grep /M1A3B6/, @AR3; 
print @S;
Run Code Online (Sandbox Code Playgroud)

但是,grep通过循环没有返回任何值.

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

示例文件如下:

@AR1
M1A3B6
M1AZ83

@AR3
>tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG
>tr|M1AP92|Uncharacterized protein >>MQTLSRAQSQ
>tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF
Run Code Online (Sandbox Code Playgroud)

所有建议将不胜感激.

Dav*_*man 7

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

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

以下是我将如何处理您发布的代码似乎意图:

#!/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;
Run Code Online (Sandbox Code Playgroud)

结果输出:

>tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG
>tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF
Run Code Online (Sandbox Code Playgroud)