我有两个嵌套包,我通过fast_cgi调用。从第一个包中我调用了第二个方法,如下所示:
$MyScalar = "A Value";
MyPackage::Inner->InvokeMe($MyScalar);
从我的其他包中,我正在解开这样的参数:
sub ZonesByCustomer($)
{
my $MyParameter = @_[0];
print $MyParameter;
}
我期望将A Value
打印出来,但实际打印出来的是MyPackage::Inner
。 A Value
实际上存储在@_[1]
中。
这似乎令人困惑。为什么包名称作为参数返回?
这是从我的代码中抽象出来的。如果我在这里缺少必要的东西,我可以提供稍微复杂的版本。
答案 0 :(得分:7)
Perl没有像许多其他语言那样的“this”变量(暗示或其他),但该方法需要该信息。相反,Perl提供类(静态方法调用)或对象(实例方法调用)作为方法的第一个参数。评估参数列表的结果如下。
需要类名的静态方法示例:
sub new {
my ($class, %args) = @_;
return bless(\%args, $class);
}
SomeClass->new(...);
需要对象的实例方法示例:
sub as_string {
my ($self) = @_;
return $self->{val};
}
$some_object->as_string();
注意:@_[0]
和@_[1]
应为$_[0]
和$_[1]
。
注意:原型通常很糟糕,在方法调用期间会被忽略。摆脱它。
答案 1 :(得分:3)
这是perlootut
。
当我们进行方法调用时,Perl会安排方法的调用 作为第一个参数传递。 Invocant是一个奇特的名字 箭头左侧的东西。调用者可以是一个 类名或对象。
所以Perl正在为方法调用做它应该做的事情。
MyPackage::Inner->InvokeMe($MyScalar)
与
相同MyPackage::Inner::InvokeMe('MyPackage::Inner', $MyScalar)
如果查看参数数组@_
的内容,您会看到$_[1]
是$MyScalar
的值。
(顺便说一下,你访问第一个参数的语法是错误的。你应该写$_[0]
,因为数组的一个元素是标量。)
答案 2 :(得分:1)
这就是OO在Perl中的工作方式。包方法将包名作为第一个参数,对象方法将对象作为第一个参数。因此,您可以将构造函数定义为包方法:
sub new {
my ($class) = @_;
bless {}, $class;
}
你可以在方法中操作对象本身:
sub frobnicate {
my ($self) = @_;
$self->_do_frob if $self->_is_frobnicable;
}