2015-05-27 19 views
1

我對Perl比較陌生,所以請耐心等待。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"); 

    ... 
} 
+2

請說明。你只顯示一個循環。你期望什麼行爲? – choroba

+0

另外,你如何調用'getGenes'? – choroba

+0

'my @names = shift;'看起來很腥;它只會有一個元素。你可能想要更多的東西在'my($ genome,@names)= @_;'的行上。 – Slade

回答

8

猜測:你叫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); 
+0

我通過列表作爲最後一個參數,它的工作原理。非常感謝。 – WalterWhite

相關問題