Как бы вы создали и проследили хэш хэшей (глубины n), в котором значения на глубине n являются целыми числами? - PullRequest
0 голосов
/ 20 марта 2012

Я хочу хранить последовательности ДНК размера n в описанной структуре данных.Каждый хеш может содержать ключи 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 ]

4 голосов
/ 21 марта 2012

Вам нужна функция 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
                 }
        };
2 голосов
/ 20 марта 2012

Должно работать следующее:

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
                 }
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...