2015-10-27 2 views
1

Я использую модуль BioPerl для получения строки из набора параметров. Я последовал за HOWTO:Beginners page. Модуль, очевидно, возвращает хэш-объект. Как получить фактическую строку из хэш-объекта?Как получить доступ к данным, хранящимся в этом объекте?

use Bio::DB::GenBank; 
use Data::Dumper; 

my $gb = Bio::DB::GenBank->new(-format  => 'Fasta', 
          -seq_start => 1, 
          -seq_stop => 251, 
          -strand  => 1 
          -complexity => 1); 
my $seq = $gb->get_Seq_by_acc('NG_016346'); 
my $sequence_string = lc($seq->seq()); 
my $seq_obj = Bio::Seq->new(-seq => $sequence_string, 
          -alphabet => 'dna'); 
my $prot_obj = $seq_obj->translate; 
print Dumper($prot_obj); 

Отпечатки Хранитель данных следующие:

$VAR1 = bless({ 
      'primary_seq' => bless({ 
             'length' => 83, 
             '_root_verbose' => 0, 
             '_nowarnonempty' => undef, 
             'seq' => 'RLCVKEGPWPAVEGTWSWG*HRPGSRACPRWGAPNSVQATSYTPSPTHAPFSVSPIPIC*MSLLEASCWPGSREDGARMSAGM', 
             'alphabet' => 'protein' 
            }, 'Bio::PrimarySeq'), 
      '_root_verbose' => 0 
      }, 'Bio::Seq'); 

Как получить 'Последовательность', который хранится в $prot_obj?

Я попытался

print $prot_obj{'primary_seq'}{'seq'}; 

но ничего не печатает. Хранитель данных напечатал слово bless. Возможно, seq - это поле объектно-ориентированной переменной.

ответ

3

Правильный формат для доступа к свойствам объекта использует ->:

print $prot_obj->{'primary_seq'}->{'seq'}; 
+0

Требуется только первый '->'. Использование '->' после каждого {} (hashref), [] (arrayref) является старым синтаксисом. –

+0

Это не обязательно старый синтаксис, это просто, что perl знает, что что-либо вложенное в ref должно быть другим ref, и потому что никогда не может быть двусмысленности, последние операции разыменования не требуются – stevieb

+4

Боюсь, я не убежден это правильная вещь. Точка OO заключается в инкапсуляции, и поэтому выталкивание непосредственно в атрибутах вложенных объектов является плохим. – Sobrique

3

Я буду оспаривать другой ответ, и сказать - правильный путь для доступа к свойствам объекта является не сделать это, и используйте вместо этого метод.

Причиной для этого является вся суть OO. Который должен инкапсулировать куски вашей программы, так что несколько разработчиков могут работать с ним одновременно, а код масштабируется, потому что вы можете найти, где все происходит неправильно.

Это работает только в том случае, если вы использовали опубликованные методы - указанный способ вождения объекта, потому что тогда вам не нужно знать, что происходит за кулисами. Это также означает, что разработчик может свободно изменять происходящее - возможно, просто проверять, но, возможно, перегружать или иметь разные ответы в зависимости от другого свойства внутри объекта.

Все это подрывается прямым доступом к объектам.

Вы не должны этого делать, даже если perl «допустит» вас. Давайте посмотрим правде в глаза, perl позволит вам делать много плохих вещей.

Bio::PrimarySeq имеет вызов метода seq. для извлечения атрибута seq(). Bio::Seq имеет аксессора для первичной последовательности:

Итак:

$prot_obj -> seq(); 

я думаю, что, вероятно, сделать это. (Хотя, документ не совсем легко читается).

1

Существует принятый ответ, но я бы также посоветовал не проталкиваться в промежутках таких объектов, за исключением того, что он видел, какой объект возвращается (или просто используйте ref).Вот как я бы подойти к решению проблемы:

use 5.010; 
use strict; 
use warnings; 
use Bio::DB::GenBank; 
use Bio::Seq; 

my $gb = Bio::DB::GenBank->new(
    -format  => 'Fasta', 
    -seq_start => 1, 
    -seq_stop => 251, 
    -strand  => 1, 
    -complexity => 1 
); 

my $seq = $gb->get_Seq_by_acc('NG_016346'); 
my $seq_obj = Bio::Seq->new(
    -id  => $seq->id, 
    -seq  => $seq->seq, 
    -alphabet => 'dna' 
); 

say join "\n", ">".$seq_obj->id, $seq_obj->translate->seq; 

Бег это дает вам переведенный FASTA запись:

>gi|283837914:1-251 
RLCVKEGPWPAVEGTWSWG*HRPGSRACPRWGAPNSVQATSYTPSPTHAPFSVSPIPIC*MSLLEASCWPGSREDGARMSAGM 

Реальная выгода от использования BioPerl находится в объединении различных классов вместе, чтобы решить проблемы с минимальными (но также читаемым и многоразовым) кодом. В вашем коде также была небольшая опечатка, которая была бы поймана с помощью строгих правил и предупреждений pragmas (вот мой лучший совет).

Смежные вопросы