遍历数组并根据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.
中对此进行了解释
这绝对不是实现您想要的最简洁的方法,但我希望它是可以理解的。
尽管如此,如果您不尝试了解正在发生的事情,您将不会有太多使用它的乐趣,因为您将需要自己进行更改。
我有一个数组,如下所述,有四列。每列分别代表开始、结束位置、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.
中对此进行了解释这绝对不是实现您想要的最简洁的方法,但我希望它是可以理解的。
尽管如此,如果您不尝试了解正在发生的事情,您将不会有太多使用它的乐趣,因为您将需要自己进行更改。