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

Looping through array and grouping data based on a criteria in perl

我有一个数组,如下所述,有四列。每列分别代表开始、结束位置、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

您可以从以下内容开始。

我假设,数据部分由单个空格分隔,如您的示例所示,并且该数据位于名为 "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 and there is an indepth introduction in http://perldoc.perl.org/perlreftut.html.

中对此进行了解释

这绝对不是实现您想要的最简洁的方法,但我希望它是可以理解的。

尽管如此,如果您不尝试了解正在发生的事情,您将不会有太多使用它的乐趣,因为您将需要自己进行更改。