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