在保持序列顺序的同时,将哈希元素从一个哈希插入另一个哈希

时间:2014-06-30 09:12:12

标签: perl hashtable

我有一个哈希表

$mainhash{$position}{$base}{$score}

存储dna序列的每个位置与发生的碱基以及它发生次数的分数。我还有另一个哈希表

$i_hash{$position}{$base}{$score} 

只有在发生插入事件时才会保留相同的信息。

对于存在的每个插入位置,我想将该位置的得分与该位置的%mainhash中的得分进行比较。如果它更大,我需要将$ base和$得分从$ i_hash插入到%mainhash中,并通过该插入移动下游的每个位置。有时这些插入事件可以连续发生。

例如,对于此序列

GATCCTGAACT 

如果在位置4处插入T,则在位置5处插入A,在位置6处插入C(假设序列从0开始):

插入后

看起来像这样:

GATC^TAC^CTGAACT

因此,在位置4发生的原始C现在位于第7位,依此类推。

我应该通过展平%mainhash来实现这个,然后使用substr函数插入基数? Os还有另外一种方法吗?我需要保持序列位置的完整性才能正确报告。

代码:

my @consensus;
for(my $k=0; $k<$length; $k++)
{
    my $pushbase;

    if (exists $i_hash{$k} && exists $mainhash{$k}) 
    {
        my $iscore;
        my $mscore;
        my $ipushbase;
        my $mpushbase;

        foreach my $ibase (keys %{$i_hash{$k}})
        {
            $ipushbase = $ibase;
            $iscore = $i_hash{$k}{$ibase};
        }
        foreach my $mbase (keys %{$mainhash{$k}})
        {
            $mpushbase = $mbase;
            $mscore = $mainhash{$k}{$mbase};
        }

        if ($iscore > $mscore)
        {
            $pushbase = $i_hash{$k}{$ipushbase};
            push @consensus, $pushbase;
            $pushbase = $mainhash{$k}{$mpushbase}; #insert the shifted position (does not handle consecutive insertion
            push @consensus, $pushbase;
        }
        else
        {
            $pushbase = $mainhash{$k}{$mpushbase};
            push @consensus, $pushbase;
        }
    }
}

这显然不能处理连续插入。我无法弄清楚如何处理连续插入,以便我可以正确地移动下游位置。

0 个答案:

没有答案