#! /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"$tempS\t$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$diff\n";
}
我有三个长度相同的数组,ID
带有ID(字符串),Start
和End
带有整数值(从文件中读取)。
我想循环遍历所有这些数组,并且还希望跟踪ID。如果开始&gt;首先在Start
与End
交换元素。结束,然后我必须对这两个数组进行排序以供进一步应用(因为我对Start[0]-Start[1]
中的每个项目否定Start
)。在排序时,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。如果开始&gt;结束我只在这两个数组之间交换它们。但是在交换降序后可能会改变,但我希望它们按降序排列,也可以按照上面的说明将它们对应的ID用于否定。
答案 0 :(得分:3)
不要使用不同的数组,使用哈希将相关的信息保存在一起。
#!/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的顺序都是相同的。