我使用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
是面向对象变量的字段。
答案 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启用(这是我最好的建议)。