1

次の基本的な Perl モジュリーノを考えてみましょう:

#!/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() 内の @_ の内容は、関数の呼び出し方法によって変わります。

何が起こっているのか説明できますか?

4

2 に答える 2

6
__PACKAGE__->run(@ARGV)

と同等です

Toto->run(1,2,3)

これはクラス メソッドの呼び出しです。->メソッド呼び出しは、最初の引数としてinvocant (評価された LHS の値) を渡します。これは、

Toto::run(1,2,3)

これは単純なサブコールです。run以下はサブとして呼び出されます。

run(@ARGV) unless caller();
于 2015-10-16T21:02:56.373 に答える
6

なんで@_に「トト」が入ってるの?クラスメソッドとして呼び出しているため、暗黙的にクラスを最初のパラメーターとして渡します。それをしたくない場合は、run(@ARGV) unless caller()代わりに実行してください。

于 2015-10-16T20:54:30.883 に答える