试图根据他们的行号解析两个数组

时间:2015-10-29 16:49:19

标签: arrays perl

我不知道这是否是解决我手边问题的方法。 我试图根据他们的名字解析序列,所以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;
     }
 }

1 个答案:

答案 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)。