我想将大小为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 })
如何从数据中创建此哈希?
发布于 2012-03-21 04:25:37
您需要的是一个函数,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
}
};发布于 2012-03-20 23:57:01
下面的代码应该可以工作:
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
}
};https://stackoverflow.com/questions/9789420
复制相似问题