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