【问题标题】:Perl: Subroutines first argument is not the classPerl:子程序的第一个参数不是类
【发布时间】:2015-08-09 18:12:21
【问题描述】:

我对 Perl 比较陌生,所以请耐心等待。

我的子 getGenes 在类 SequenceModule 中调用 getFeaturesByGeneName。第一个循环运行良好,但是在第二个循环中它尝试在字符串 $name 上调用 get_SeqFeatures(一个 BioPerl 子),这意味着它跳过了我的 $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
  • my @names = shift; 看起来很可疑;它只会有一个元素。你可能想要更多类似my ($genome, @names) = @_; 的东西。

标签: perl subroutine


【解决方案1】:

推测:你给getGenes打了几个名字:

getGenes(('name1', 'name2'), $genome);

列表不嵌套在 Perl 中,所以参数是扁平的:

getGenes('name1', 'name2', $genome);

shift 不能返回多个元素。因此,

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

【讨论】:

  • 我将列表作为最后一个参数传递,它可以工作。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多