2012-03-20 40 views
0

我想在所描述的數據結構中存儲大小爲n的DNA序列。每個散列可以包含將具有散列值的鍵C,G,A,T。這些散列值將是完全相同的散列值 - 它們將具有四個密鑰C,G,A,T,它們將具有散列值。你將如何創建和遍歷散列(深度爲n)的散列,從而深度n處的值是整數?

該結構對於n級哈希值是一致的。但是,最後一個散列值將具有整數值,它表示從級別1到級別n的序列數量。給定數據('CG','CA','TT','CG'),表示序列CG,CA和TT發生兩次,一次和一次。對於這個數據,深度將爲2.

這將產生一個哈希值: %root =('C'=>'''''> 2,'A'=> 1},'T'= > {'T'=> 1})

如何從數據創建這個散列?

+0

SRY我真的不明白你想要什麼。也沒有明確的問題! – Neysor 2012-03-20 15:38:54

+0

你在試圖構建一個基數搜索特里? – tchrist 2012-03-20 16:47:30

回答

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 
       } 
     }; 
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 
       } 
     }; 
+0

如果存在$ hash {key}',你可以說'$ hash {key} // = {}'而不是'$ hash {key} = {}。它不完全相同(因爲它檢查是否定義了$ hash key而不是exists),但存在於'defined'(根據我的理解)的主要優點是'// ='如果定義了「$ hash {key}」,但其值爲「undef」,將會失敗。我覺得'// ='更容易閱讀。因人而異。 – flies 2012-04-05 20:36:21