2014-06-15 46 views
4

我是這個網站的新手,請耐心等待,如果這個問題已經在其他地方得到了解答。我試圖從模塊「codons1.pm」中調用一個子程序「bar」,並且遇到錯誤: 無法通過軟件包「codons1.pm」找到對象方法「bar」(也許您忘記了加載「codons1 。下午」?)。主要的腳本是這樣的:Perl:無法通過程序包找到對象方法欄

use strict; 
use warnings; 
my $i = 1; 
my $pack = "codons$i\.pm"; 
require $pack; 
(my %temp) = $pack->bar(); 
print keys %INC ; 

感謝(Perl objects error: Can't locate object method via package),我可以使用%INC覈實,該模塊被加載。 模塊的樣子:

package codons1; 
sub bar{ #some code; 
return (%some_hash);} 
1; 

我使用$我,這樣我可以通過一個循環加載多個類似的模塊。歡迎任何建議,並提前致謝。

+2

你加載的文件名,但畢竟是不一樣的包名。包名稱由'package'關鍵字定義。文件名無關緊要,除非您使用裸詞作爲'require'參數。例如。 '使用foo',它尋找'foo.pm'。 – TLP

回答

2

一個更好的方式來做到你想做到

#!/usr/bin/perl 
use strict; 
use warnings; 
package codons1; 
sub new { 
    my $class = shift; 
    return bless {}, $class; 
} 
sub bar { 
    my %some_hash = (temperature=>"35"); 
    return %some_hash; 
} 
1; 
package main; 
my $object = codons1->new(); #creates the object of codons1 
my %temp = $object->bar(); #call the bar method from codons1's object 
print keys %temp; 

Demo

你需要學習Perl中基本的面向對象編程的東西。從perlootut開始,然後從perlobj開始。閱讀Object Oriented Perl chapter免費提供的初學Perl書籍。

+0

或使用'Moo'或'Moose',現代的Perl對象框架。 –

4

您的包裹是codons1,而您正試圖撥打codons1.pm->bar。以下任一將正常工作:

my $pack = "codons$i"; 
require "$pack.pm"; 
$pack->bar(); 

my $pack = "codons$i"; 
eval "require $pack"; 
$pack->bar(); 
相關問題