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

时间:2015-10-27 20:28:18

标签: string perl oop object bioperl

我使用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' );

我如何获得' seq'存储在$prot_obj

我试过

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

但它没有打印任何东西。数据转储器打印了单词bless。也许seq是面向对象变量的字段。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

这仅适用于您使用已发布的方法 - 指定的驱动对象的方式 - 因为那时您不必知道幕后发生了什么。它还意味着实现者可以自由地改变正在发生的事情 - 可能只是验证,但可能会超载或根据对象中的另一个属性进行不同的响应。

通过直接访问对象属性来破坏所有这些。

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

Bio::PrimarySeq的方法调用为seq。检索seq()属性。 Bio::Seq具有主序列的访问者:

所以:

$prot_obj -> seq(); 

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

答案 2 :(得分: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的真正好处是将不同的类组合在一起,以解决最小(但也可读和可重用)代码的问题。你的代码中还有一个小错字,它会被严格的警告pragma启用(这是我最好的建议)。