2015-10-16 22 views
1

考慮以下基本的Perl modulino:Modulino包的名字添加到@_

#!/usr/bin/perl -l 
package Toto; 

__PACKAGE__->run(@ARGV) unless caller(); 

sub run 
{ 
    print "@ARGV"; 
    print "@_"; 
} 

1; 

如果我在命令行中運行它,我得到:

$ ./Toto.pm 1 2 3 
1 2 3 
Toto 1 2 3 

如果我把它從測試:

$ perl -MToto -le 'Toto::run(1,2,3)'  
#first line blank - no ARGV set 
1 2 3 

換句話說,run()中@_的內容根據函數的調用方式而變化。

你能解釋一下發生了什麼嗎?

回答

6
__PACKAGE__->run(@ARGV) 

相當於

Toto->run(1,2,3) 

這是一個類的方法調用。方法調用將調用者(->的LHS所評估的值)作爲第一個參數傳遞。這不同於

Toto::run(1,2,3) 

這是一個簡單的子呼叫。下文將稱之爲run作爲子:「:試圖複製釋放標恐慌」

run(@ARGV) unless caller(); 
+0

你也可以刪除該行並用'if(caller)'替換'sub main'。 – ikegami

6

你的意思是爲什麼「@ Toto」在@_中?因爲您將它稱爲類方法,所以它隱式地將該類作爲第一個參數傳遞。如果你不想這樣做,只需做run(@ARGV) unless caller()

+0

注意,有可能使用這個電話時,也使用'的Getopt ::龍:: GetOptions',請參閱[錯誤是一個問題當使用Getopt :: Long](http://stackoverflow.com/questions/26508899/error-panic-attempt-to-copy-freed-scalar-when-using-getoptlong) –

+0

@HåkonHæglandmodulino(有時也稱爲progmod)不應該在代碼中調用GetOptions,而是將它用作模塊而不是程序時運行。但是你的觀點是:通用全局變量是一個不好的主意,因爲它們可以從你下面改變。 – ysth