你将如何创建和遍历散列(深度为n)的散列,其中深度为n的值是整数?

时间:2012-03-20 15:09:40

标签: perl hash bioinformatics

我想在所描述的数据结构中存储大小为n的DNA序列。每个哈希可以包含具有哈希值的密钥C,G,A,T。这些哈希值将是完全相同的哈希值 - 它们将具有四个键,C,G,A,T将具有哈希值。

此结构对于n级哈希值是一致的。但是,最后一级哈希将具有整数值,它表示从级别1到级别n的序列计数。

给定数据('CG','CA','TT','CG'),表明序列CG,CA和TT出现两次,一次和一次。对于此数据,深度为2。

这会产生一个哈希: %root =('C'=> {'G'=> 2,'A'=> 1},'T'=> {'T'=> 1})

如何从数据中创建此哈希?

2 个答案:

答案 0 :(得分:4)

你需要的是一个函数get_node($tree, 'C', 'G')返回对“CG”的哈希元素的引用。然后你可以增加引用的标量。

sub get_node {
   my $p = \shift;
   $p = \( ($$p)->{$_} ) for @_;
   return $p;
}

my @seqs = qw( CG CA TT CG );

my $tree;
++${ get_node($tree, split //) } for @seqs;

问题是,此功能已作为Data::DiverDiveRef存在。

use Data::Diver qw( DiveRef );

my @seqs = qw( CG CA TT CG );

my $tree = {};
++${ DiveRef($tree, split //) } for @seqs;

在这两种情况下,

use Data::Dumper qw( Dumper );
print(Dumper($tree));

打印

$VAR1 = {
          'T' => {
                   'T' => 1
                 },
          'C' => {
                   'A' => 1,
                   'G' => 2
                 }
        };

答案 1 :(得分:2)

以下内容应该有效:

use Data::Dumper;

my %data;
my @sequences = qw(CG CG CA TT);

foreach my $sequence (@sequences) {
    my @vars = split(//,$sequence);
    $data{$vars[0]} = {} if (!exists($data{$vars[0]}));
    my $startref = $data{$vars[0]};
    for(my $i = 1; $i < $#vars; $i++) {
    $startref->{$vars[$i]} = {} if (!exists($startref->{$vars[$i]}));
    $startref = $startref->{$vars[$i]};
    }
    $startref->{$vars[$#vars]}++;
}

print Dumper(\%data);

产地:

$VAR1 = {
          'T' => {
                   'T' => 1
                 },
          'C' => {
                   'A' => 1,
                   'G' => 2
                 }
        };