Perl包方法是将包名称作为第一个参数返回

时间:2012-06-13 23:30:25

标签: perl

我有两个嵌套包,我通过fast_cgi调用。从第一个包中我调用了第二个方法,如下所示:

$MyScalar = "A Value";
MyPackage::Inner->InvokeMe($MyScalar);

从我的其他包中,我正在解开这样的参数:

sub ZonesByCustomer($)
{
    my $MyParameter = @_[0];
    print $MyParameter;
}

我期望将A Value打印出来,但实际打印出来的是MyPackage::InnerA Value实际上存储在@_[1]中。

这似乎令人困惑。为什么包名称作为参数返回?

这是从我的代码中抽象出来的。如果我在这里缺少必要的东西,我可以提供稍微复杂的版本。

3 个答案:

答案 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;   
}