我想在所描述的数据结构中存储大小为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})
如何从数据中创建此哈希?
答案 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::Diver的DiveRef
存在。
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
}
};