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

Perl包方法将包名作为第一个参数返回,perl,Perl,我有两个嵌套包,我正在通过fast_cgi调用它们。在第一个包中,我调用了第二个包中的一个方法,如下所示: $MyScalar = "A Value"; MyPackage::Inner->InvokeMe($MyScalar); 从我的另一个包中,我将展开如下参数: sub ZonesByCustomer($) { my $MyParameter = @_[0]; print $MyParameter; } 我希望打印出一个值,但实际打印出的是MyPackage::I

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

$MyScalar = "A Value";
MyPackage::Inner->InvokeMe($MyScalar);
从我的另一个包中,我将展开如下参数:

sub ZonesByCustomer($)
{
    my $MyParameter = @_[0];
    print $MyParameter;
}
我希望打印出一个值,但实际打印出的是MyPackage::Inner。一个值实际上被存储在@u1中

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

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

这是来自

当我们进行方法调用时,Perl会安排方法的invocant 作为第一个参数传递。Invocant是一个花哨的名字 箭头左边的东西。发票可以是 类名称或对象

因此Perl正在做它应该为方法调用做的事情

MyPackage::Inner->InvokeMe($MyScalar)
与相同

MyPackage::Inner::InvokeMe('MyPackage::Inner', $MyScalar)
如果查看参数数组@的内容,您将看到$[1]是$MyScalar的值

顺便说一句,您访问第一个参数的语法是错误的。您应该写入$\u0,因为数组的一个元素是标量。

这是从

当我们进行方法调用时,Perl会安排方法的invocant 作为第一个参数传递。Invocant是一个花哨的名字 箭头左边的东西。发票可以是 类名称或对象

因此Perl正在做它应该为方法调用做的事情

MyPackage::Inner->InvokeMe($MyScalar)
与相同

MyPackage::Inner::InvokeMe('MyPackage::Inner', $MyScalar)
如果查看参数数组@的内容,您将看到$[1]是$MyScalar的值


顺便说一句,您访问第一个参数的语法是错误的。您应该编写$\u0,因为数组的一个元素是标量。

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

sub new {
    my ($class) = @_;
    bless {}, $class;
}
您可以在方法中对对象本身进行操作:

sub frobnicate {
    my ($self) = @_;
    $self->_do_frob if $self->_is_frobnicable;   
}

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

sub new {
    my ($class) = @_;
    bless {}, $class;
}
您可以在方法中对对象本身进行操作:

sub frobnicate {
    my ($self) = @_;
    $self->_do_frob if $self->_is_frobnicable;   
}

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();
注意:@u[0]和@[1]应该是$[0]和$[1]


注意:原型通常不好,在方法调用期间被忽略。摆脱它。

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();
注意:@u[0]和@[1]应该是$[0]和$[1]


注意:原型通常不好,在方法调用期间被忽略。摆脱它。

它实际上接近MyPackage::Inner->can'InvokeMe'->'MyPackage::Inner',$MyScalar。它实际上接近MyPackage::Inner->can'InvokeMe'->'MyPackage::Inner',$MyScalar。我应该说这个方法还需要这些信息哈哈:D@ikegami原型是子程序声明的$部分吗?为什么原型不好?为了清楚起见,我把变量的读数从my$argument=@u切换到my bad。我应该说这个方法需要这些信息哈哈:D@ikegami原型是子程序声明的$部分吗?为什么原型不好?为了清晰起见,我将变量的读取从my$参数=@uu切换到my bad.Frobnicatable Frobnicatable