如何访问存储在该对象中的数据?

How to access the data stored in this object?

我正在使用 BioPerl 模块从一组参数中获取字符串。我跟着HOWTO:Beginners page。该模块显然 returns 一个散列对象。如何从散列对象中获取实际字符串?

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 中的 'seq'?

我试过了

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

但它不打印任何内容。 Data dumper 打印了单词 bless。也许seq是一个面向对象变量的字段。

访问对象属性的正确格式使用 ->:

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

我要对另一个答案提出异议,并说 - 访问对象属性的正确方法是这样做,而是使用方法。

这样做的原因是面向对象的重点。这是封装你的程序块,这样多个开发人员可以同时使用它,并且代码可以扩展,因为你可以更容易地找到出错的地方。

这仅在您使用已发布的方法(驱动对象的指定方式)时有效,因为这样您就不必知道幕后发生的事情。这也意味着实施者可以自由地改变正在发生的事情 - 可能只是验证,但可能会根据对象中的另一个 属性 重载或有不同的响应。

直接访问对象属性颠覆了这一切。

你不应该这样做,即使 perl 会 "let" 你。面对现实吧,perl 会让你做很多坏事。

Bio::PrimarySeq has a method call of seq. to retrieve the seq() attribute. Bio::Seq 具有主序列的访问器:

所以:

$prot_obj -> seq(); 

我想可能会这样做。 (虽然,该文档并不是很容易阅读)。

有一个公认的答案,但我也建议不要在对象的间隔中四处寻找,唯一的例外是查看返回的对象类型(或仅使用 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 的真正好处在于将不同的 类 结合在一起,用最少的(但也是可读和可重用的)代码解决问题。您的代码中还有一个小错字,在启用严格和警告编译指示的情况下会被发现(这是我最好的建议)。