在perl中交换和排序其他两个数组时进行ID跟踪

时间:2015-09-04 06:51:20

标签: arrays perl

#! /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(字符串),StartEnd带有整数值(从文件中读取)。

我想循环遍历所有这些数组,并且还希望跟踪ID。如果开始&gt;首先在StartEnd交换元素。结束,然后我必须对这两个数组进行排序以供进一步应用(因为我对Start[0]-Start[1]中的每个项目否定Start)。在排序时,Id值可能会发生变化,并且由于我的ID对于每个Start和End元素都是唯一的,因此如何在排序时跟踪我的ID?

我正在考虑三个阵列IDStartEnd

以下是我输入数据的一小部分:

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用于否定。

1 个答案:

答案 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的顺序都是相同的。