1

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

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

从我的另一个包中,我正在展开如下参数:

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

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

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

这是从我的代码中抽象出来的。如果我在这里遗漏了一些必不可少的东西,我可以提供一个稍微复杂一点的版本。

4

3 回答 3

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]and@_[1]应该是$_[0]and $_[1]

注意:原型通常很糟糕,在方法调用期间会被忽略。摆脱它。

于 2012-06-14T00:44:09.907 回答
3

这是从perlootut

当我们进行方法调用时,Perl 安排方法的调用者作为第一个参数传递。Invocant 是箭头左侧事物的一个花哨名称。调用者可以是类名或对象。

所以 Perl 正在为方法调用做它应该做的事情。

MyPackage::Inner->InvokeMe($MyScalar)

等同于

MyPackage::Inner::InvokeMe('MyPackage::Inner', $MyScalar)

如果您查看参数数组的内容,@_您将看到它$_[1]的值$MyScalar

(顺便说一句,您访问第一个参数的语法是错误的。您应该写成$_[0]数组的一个元素是标量。)

于 2012-06-13T23:46:32.400 回答
1

这就是 OO 在 Perl 中的工作方式。包方法将包名作为第一个参数,对象方法将对象作为第一个参数。因此,您可以将构造函数定义为封装方法:

sub new {
    my ($class) = @_;
    bless {}, $class;
}

您可以在方法中对对象本身进行操作:

sub frobnicate {
    my ($self) = @_;
    $self->_do_frob if $self->_is_frobnicable;   
}
于 2012-06-13T23:47:54.427 回答