2015-10-14 14 views
1

當試圖在其他perl文件中調用子例程(在用戶定義的模塊中定義)時,值嘗試在perl中使用PackageName :: ModuleName-> subroutine(「xyz」)調用子例程時獲取錯誤的參數值

#moduleName.pm 

package PackageName::moduleName; 
use strict; 
use warnings; 
use base 'Exporter'; 

sub callMe{ 
    my($readArg)=(@_); 
    print $readArg; 
} 


#test.pl 

use strict; 
use warnings; 
use FindBin;     # locate this script 
use lib 'path to parent directory'; # use the parent directory 
use PackageName::moduleName; 

if(my $temp=PackageName::moduleName->callMe("test")){ 
    print" True : $temp\n"; 
} 

$溫度的函數打印值:PACKAGENAME :: MODULENAME

無法找出原因。

P.S.在調用子程序時,我必須保持相同的約定

+0

你的命名有點不吉利。您的_package_的名稱是'package'關鍵字後的所有內容。 _module_的名稱通常是相同的。在談論CPAN時,軟件包名稱的所有部分,但最右邊的部分通常稱爲_namespace_。有一個'Data'命名空間,裏面有幾個不同的模塊,比如'Data :: Dumper','Data :: Printer'和'Data :: Dump'。 – simbabque

回答

1

由於您通過->調用它的方式。

當你這樣做時,perl會傳遞額外的參數,所以你可以構造一個構造函數(new)。

E.g.

my $thing = Package::Module -> new(); 

傳遞的第一個參數是類,因此您可以將其用於bless。參見: perlootut

E.g.

sub new { 
    my ($class, @args) = @_; 
    my $self = {}; 
    bless ($self, $class); 
} 

這也適用於當你調用一個實例化對象:

$thing -> do_something(); 

它傳遞給$self的引用作爲第一個參數。

sub do_something { 
    my ($self, @args) = @_; 
    print "Got args of @args\n"; 
    $self -> {firstarg} = shift (@args); 
} 

如果你想這樣做,而是嘗試:

PackageName::ModuleName::callMe("test"); 
+0

感謝您的信息 – user3214392

3

你調用一個函數作爲一個類的方法與Foo::Bar->frobnicate(@args)。在這種情況下,Perl會做,因爲箭頭->下面的事情:

  • 檢查什麼的箭頭左邊
    • 如果是blessed,查找包(如$q是包CGI
    • 如果它不祝福,認爲這是一個包裝(如Foo::Bar
  • 該包命名空間中,找到名爲子在箭頭的右側(例如,frobnicate
  • 調用子,並通過什麼上的箭頭左邊爲第一個參數

現在看起來是這樣的:

Foo::Bar::frobnicate('Foo::Bar', @args); 

在frobnicate,你必須處理即:

sub frobnicate { 
    my ($class, @args) = @_; 
    # ... 
} 

這通常是在new,這是最可能的y使用類方法

如果您不想處理它,請直接在其名稱空間中調用sub,而不要使用箭頭符號。

my $rv = Foo::Bar::frobnicate(@args); 
相關問題