Perl:子例程的第一个参数不是 class
Perl: Subroutines first argument is not the class
我对 Perl 比较陌生,所以请多多包涵。
我的子 getGenes 在 class SequenceModule 中调用 getFeaturesByGeneName。第一个循环运行良好,但是在第二个循环中,它尝试在字符串 $name 上调用 get_SeqFeatures(一个 BioPerl sub),这意味着它跳过了我的 $self = shift.
我错过了什么?
sub getGenes
{
my @names = shift;
my $genome = shift;
my @cds;
foreach my $name (@names)
{
my $feat = SequenceModule -> getFeatureByGeneName($genome, $name);
push (@cds, $feat);
}
return @cds;
}
...
sub getFeatureByGeneName
{
my $self = shift;
my $seq = shift;
my $name = shift;
my @cds = $seq -> get_SeqFeatures("CDS");
...
}
推测:您用几个名字给 getGenes
打电话:
getGenes(('name1', 'name2'), $genome);
列表不嵌套在 Perl 中,因此参数被扁平化:
getGenes('name1', 'name2', $genome);
shift
不能 return 超过一个元素。因此,
my @names = shift;
相当于
my @names;
$names[0] = shift;
第二个名字还在@_
,所以转到$genome
:
my $genome = shift;
如果需要将列表传递给子项,请将其作为最后一个参数,或发送引用:
sub getGenes {
my $genome = shift;
my @names = @_;
}
getGenes($genome, 'name1', 'name2');
# OR
sub getGenes {
my $names = shift;
my $genome = shift;
for my $name (@$names) { # dereference
...
}
}
getGenes(['name1', 'name2'], $genome);
我对 Perl 比较陌生,所以请多多包涵。
我的子 getGenes 在 class SequenceModule 中调用 getFeaturesByGeneName。第一个循环运行良好,但是在第二个循环中,它尝试在字符串 $name 上调用 get_SeqFeatures(一个 BioPerl sub),这意味着它跳过了我的 $self = shift.
我错过了什么?
sub getGenes
{
my @names = shift;
my $genome = shift;
my @cds;
foreach my $name (@names)
{
my $feat = SequenceModule -> getFeatureByGeneName($genome, $name);
push (@cds, $feat);
}
return @cds;
}
...
sub getFeatureByGeneName
{
my $self = shift;
my $seq = shift;
my $name = shift;
my @cds = $seq -> get_SeqFeatures("CDS");
...
}
推测:您用几个名字给 getGenes
打电话:
getGenes(('name1', 'name2'), $genome);
列表不嵌套在 Perl 中,因此参数被扁平化:
getGenes('name1', 'name2', $genome);
shift
不能 return 超过一个元素。因此,
my @names = shift;
相当于
my @names;
$names[0] = shift;
第二个名字还在@_
,所以转到$genome
:
my $genome = shift;
如果需要将列表传递给子项,请将其作为最后一个参数,或发送引用:
sub getGenes {
my $genome = shift;
my @names = @_;
}
getGenes($genome, 'name1', 'name2');
# OR
sub getGenes {
my $names = shift;
my $genome = shift;
for my $name (@$names) { # dereference
...
}
}
getGenes(['name1', 'name2'], $genome);