如何访问存储在该对象中的数据?
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 的真正好处在于将不同的 类 结合在一起,用最少的(但也是可读和可重用的)代码解决问题。您的代码中还有一个小错字,在启用严格和警告编译指示的情况下会被发现(这是我最好的建议)。
我正在使用 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 的真正好处在于将不同的 类 结合在一起,用最少的(但也是可读和可重用的)代码解决问题。您的代码中还有一个小错字,在启用严格和警告编译指示的情况下会被发现(这是我最好的建议)。