我不知道这是否是解决我手边问题的方法。 我试图根据他们的名字解析序列,所以if then语句就可以了。我遇到的问题是将每个阵列线与其对应物相关联。 (所以命名为序列)。我认为每个数组的行号都可以工作。
我会用哈希做这个,但是由于你不能有多个具有相同名称的键,所以不会有效。
示例数据
>seq1
aaaaa
>seq2
ggggg
>seq1
atatata
我到目前为止的剧本
open(INPUT_FILE, $ARGV[0]) or die "Cannot open the file: $!";
my @name;
my @sequence;
while (my $line = <INPUT_FILE>) {
if ($line =~ /^>(\S+)/) {
push @name, $line;
$line = <INPUT_FILE>;
push @sequence, $line;
}
}
答案 0 :(得分:0)
您逐行阅读,然后尝试阅读额外的一行。
我可以建议您使用$/
并将其设置为"\n>"
;
#!/usr/bin/perl
use strict;
use warnings;
local $/ = "\n>";
while ( <DATA> ) {
my ( $name, $sequence ) = split;
$name=~s/^>//g; #remove a leading `>`
print "$name => $sequence\n";
}
__DATA__
>seq1
aaaaa
>seq2
ggggg
>seq1
atatata
如果您的姓名&#34;是唯一的,您可以使用哈希来保存数据。但这有一个警告 - 没有重复的键,并且哈希显然是无序的。这似乎不适合你的数据,所以我建议你可以使用一系列哈希:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
local $/ = "\n>";
my @sequences;
while ( <DATA> ) {
my ( $name, $sequence ) = split;
$name=~s/^>//g; #remove a leading `>`
push ( @sequences, { name => $name, sequence => $sequence } );
}
foreach my $sequence ( @sequences ) {
print $sequence -> {'name'}, " => ", $sequence -> {'sequence'},"\n";
}
print Dumper \@sequences;
__DATA__
>seq1
aaaaa
>seq2
ggggg
>seq1
atatata
因此你的结构结束了:
$VAR1 = [
{
'name' => 'seq1',
'sequence' => 'aaaaa'
},
{
'name' => 'seq2',
'sequence' => 'ggggg'
},
{
'sequence' => 'atatata',
'name' => 'seq1'
}
];
作为评论中的choroba注释 - 数组的哈希也可以是一个选项:
#at start of prog
my %sequences;
然后在循环中:
push ( @{ $sequences{$name} }, $sequence );
这会给你:
$ VAR1 = { &#39; SEQ2&#39; =&GT; [ &#39; GGGGG&#39; ] &#39; SEQ1&#39; =&GT; [ &#39; AAAAA&#39 ;, &#39; atatata&#39; ] };
这样做的优点在于它将序列与它们各自的键相关联。缺点是它会丢失您在文件中的顺序(序列将按照它们在文件中看到的顺序,但名称将赢得&t; t)。