我正在尝试使用以下代码在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
我们将不胜感激。
答案 0 :(得分:7)
您发布的代码的结构存在一些重大问题:
$j
两次(一次使用$j++
语句中的for
,然后是循环体中的另一个$j++
)。这将导致它跳过@AR1
中的所有其他元素。因为使用C风格的循环很容易犯这样的错误,所以当你使用for (@list)
代替C风格for (;;)
时通常会更好只是迭代一个项目列表。@S
,这会将任何现有内容替换为新的grep
结果。这意味着,在循环结束时,@S
仅包含在最后一次迭代中找到的结果,而不是整个过程中找到的所有结果。您需要附加到@S
。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;
结果输出:
>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";