#! /usr/bin/perl
use strict;
my (@data,$data,@data1,@diff,$diff,$tempS,$tempE, @ID,@Seq,@Start,@End, @data2);
#my $file=<>;
open(FILE, "< ./out.txt");
while (<FILE>){
chomp $_;
#next if ($line =~/Measurement count:/ or $line =~/^s+/) ;
#push @data, [split ("t", $line)] ;
my @data = split('t');
push(@ID, $data[0]);
push(@Seq, $data[1]);
push(@Start, $data[2]);
push(@End, $data[3]);
# push @$data, [split ("t", $line)] ;
}
close(FILE);
my %hash = map { my $key = "$ID[$_]"; $key => [ $Start[$_], $End[$_] ] } (0..$#ID);
for my $key ( %hash ) {
print "Key: $key contains: ";
for my $value ($hash{$key} ) {
print " $hash{$key}[0] ";
}
print "n";
}
for (my $j=0; $j <=$#Start ; $j++)
{
if ($Start[$j] > $End[$j])
{
$tempS=$Start[$j];
$Start[$j]=$End[$j];
$End[$j]=$tempS;
}
print"$tempSt$Start[$j]t$End[$j]n";
}
my @sortStart = sort { $a <=> $b } @Start;
my @sortEnd = sort { $a <=> $b } @End;
#open(OUT,">>./trial.txt");
for(my $i=1521;$i>=0;$i--)
{
print "hey";
my $diff = $sortStart[$i] - $sortStart[$i-1];
print "$ID[$i]t$diffn";
}
我有三个相同长度的数组,ID
具有id(字符串),Start
和End
具有整数值(从文件读取)。
我想循环遍历所有这些数组,还想跟踪id。首先,如果开始>结束,我将与End
交换Start
中的元素,然后我必须对这两个数组进行排序以供进一步应用(因为我为Start
中的每个项目否定Start[0]-Start[1]
)。在排序时,Id值可能会改变,并且由于我的Id对于每个Start和End
元素都是唯一的,我如何在排序时跟踪我的Id ?
三个数组,ID
, Start
和End
,在我的考虑之下。
这是我的一小块输入数据:
DQ704383 191990066 191990037
DQ698580 191911184 191911214
DQ724878 191905507 191905532
DQ715191 191822657 191822686
DQ722467 191653368 191653339
DQ707634 191622552 191622581
DQ715636 191539187 191539157
DQ692360 191388765 191388796
DQ722377 191083572 191083599
DQ697520 189463214 189463185
DQ709562 187245165 187245192
DQ540163 182491372 182491400
DQ720940 180753033 180753060
DQ707760 178340696 178340726
DQ725442 178286164 178286134
DQ711885 178250090 178250119
DQ718075 171329314 171329344
DQ705091 171062479 171062503
上述ID, Start, End。如果Start> End,我只在这两个数组之间交换它们。但是在交换降序后可能会改变,但我希望它们按照降序排列,也希望它们对应的ID可以如上所述进行否定。
不要使用不同的数组,使用散列将相关的信息片段保存在一起。
#!/usr/bin/perl
use warnings;
use strict;
use enum qw( START END );
my %hash;
while (<>) {
my ($id, $start, $end) = split;
$hash{$id} = [ $start < $end ? ($start, $end)
: ($end, $start) ];
}
my @by_start = sort { $hash{$a}[START] <=> $hash{$b}[START] } keys %hash;
my @by_end = sort { $hash{$a}[END] <=> $hash{$b}[END] } keys %hash;
use Test::More;
is_deeply(@by_start, @by_end, 'same');
done_testing();
此外,在您提供的数据示例中,无论如何排序,id的顺序都是相同的。