我正在尝试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)
所有建议将不胜感激.
您发布的代码的结构中存在一些重要问题:
$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;
Run Code Online (Sandbox Code Playgroud)
结果输出:
>tr|M1A3B6|Uncharacterized protein >>MFNLHLLAVG
>tr|M1AZ83|Uncharacterized protein >>MASFTTLTSLFFFF
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |