循环遍历数组并根据perl中的条件对数据进行分组

时间:2015-03-15 19:33:49

标签: arrays perl loops conditional grouping

我有一个如下所述的数组,有四列。每列分别代表起始,终止位置,DNA链和基因。我想将每行分类为多个组,如下所述。

标准:当一行的结束位置与下一行的开始位置之间的差异小于55时,它将被分组在一个列表中。

410 1750 + dnaA     
1939 3075 + dnaB     
3206 3421 + daaR    
3437 4549 + becG     
4567 4812 + yaaB  
4860 6783 + vyrY   
15915 17381 + guaB   
19062 19946 + UsaD  
19968 20558 + byaE

output format:

List 1:  
410 1750 + dnaA

List 2:  
1939 3075 + dnaN

List 3:  
3206 3421 + yaaA  
3437 4549 + recF  
4567 4812 + yaaB  
4860 6783 + gyrB

List 4:   
15915 17381 + guaB

List 5:   
19062 19946 + yaaD   
19968 20558 + yaaE

1 个答案:

答案 0 :(得分:-3)

您可以使用以下内容作为开始。

我假设,数据部分由单个空格分割,如示例中所示,并且数据位于名为" data.txt"的文件中。

结果是一个包含要组合在一起的元素的数组数组。

#!/usr/bin/perl
#

use strict;
use warnings;

use Data::Dumper;

open(my $fd, "<", "data.txt")
    || die("could not open file: $!");


my @sets;

my %last;
my $set_index = 0;

while (<$fd>) {

    my %current;

    ($current{start}, $current{end}, undef, $current{sequence}) = split(" ", $_);
  if(exists($last{end}) &&
       $current{start} - $last{end} >= 55) {
        push(@sets, []);
        $set_index++;
    }
    push(@{$sets[$set_index]}, \%current);

    %last = %current;
}

print Dumper(@sets);

除了知道数组和散列之外,您还需要了解如何使用引用使用perl构建复杂的数据结构。这在http://perldoc.perl.org/perlref.html中有解释,http://perldoc.perl.org/perlreftut.html中有深入介绍。

这绝对不是达到你想要的最简洁的方式,但我希望,这是可以理解的。

尽管如此,如果你不想了解正在发生的事情,你将不会对此感到高兴,因为你需要对自己进行更改。