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)

这是一个类方法调用。方法调用将调用者(评估的 LHS 的->值)作为第一个参数传递。这不同于

Toto::run(1,2,3)

这是一个简单的子调用。以下将run作为子调用:

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

你的意思是为什么@_中有“Toto”?因为您将它作为类方法调用,所以它隐式地将类作为第一个参数传递。如果你不想那样做,那就做吧run(@ARGV) unless caller()

于 2015-10-16T20:54:30.883 回答