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