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' );

如何获得存储在 'seq' 中的“seq” $prot_obj

我试过

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

但它不打印任何东西。数据转储器打印了这个词bless。Maybeseq是一个面向对象变量的字段。

4

3 回答 3

3

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

print $prot_obj->{'primary_seq'}->{'seq'};
于 2015-10-27T20:31:45.447 回答
3

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

这样做的原因是 OO 的重点。这是封装程序的块,以便多个开发人员可以同时使用它,并且代码可以扩展,因为您可以更轻松地找到问题所在。

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

所有这一切都被直接访问对象属性所颠覆。

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

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

所以:

$prot_obj -> seq(); 

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

于 2015-10-27T22:04:38.407 回答
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 的真正好处在于将不同的类组合在一起,用最少的(但也是可读和可重用的)代码来解决问题。您的代码中还有一个小错字,可能会在启用严格和警告编译指示的情况下被捕获(这是我最好的建议)。

于 2015-10-28T16:52:53.913 回答