Modulino 包名添加到@_

Modulino package name added to @_

考虑以下基本的 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

换句话说,运行() 中@_ 的内容根据函数的调用方式而变化。

你能解释一下这是怎么回事吗?

你的意思是为什么"Toto"在@_?因为您将其作为 class 方法调用,所以它隐式地将 class 作为第一个参数传递。如果您不想这样做,请改为 run(@ARGV) unless caller()

__PACKAGE__->run(@ARGV)

等同于

Toto->run(1,2,3)

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

Toto::run(1,2,3)

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

run(@ARGV) unless caller();