Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这两个语句在perl中总是相同的吗?_Perl_Oop - Fatal编程技术网

这两个语句在perl中总是相同的吗?

这两个语句在perl中总是相同的吗?,perl,oop,Perl,Oop,有人知道它们是否相同吗?否。->运算符意味着调用引用(在本例中为对象引用),它将查找SUPER方法,而不是超基类 下面是显示它的代码: $obj->SUPER::promote(); $obj->SUPER->promote(); 运行它,您将获得: #!/usr/bin/perl -w package MyOBJ; use strict; use warnings; use Data::Dumper; sub new { my ($class) = @_;

有人知道它们是否相同吗?

否。->运算符意味着调用引用(在本例中为对象引用),它将查找SUPER方法,而不是超基类

下面是显示它的代码:

$obj->SUPER::promote();

$obj->SUPER->promote();
运行它,您将获得:

#!/usr/bin/perl -w

package MyOBJ;

use strict;
use warnings;

use Data::Dumper;

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

    my $self = {};

    bless $self, $class;

    return $self;
}

sub promote {
    my ($self) = @_;

    print Dumper($self);

}

1;

package MyOBJ::Sub;

use strict;
use warnings;

use base 'MyOBJ';

1;

use strict;
use warnings;

my $obj = MyOBJ::Sub->new();

$obj->SUPER::promote();
当您将最后一行更改为使用->而不是时,您会得到:

$VAR1 = bless( {}, 'MyOBJ::Sub' );
从“perldoc perlop”手册

箭头运算符

如果右侧是“[…]”、“{…}”或“(…)”下标,则左侧必须分别是对数组、哈希或子例程的硬引用或符号引用

否则,右侧是一个方法名或一个包含方法名或子例程引用的简单标量变量,左侧必须是一个对象(受祝福的引用)或类名(即包名)


由于左侧既不是对象引用,也不是类名(SUPER是一种为多态性定义的语言),它被视为一种方法,而这种方法并不存在,因此会出现错误。

您可以自己尝试并找出答案。:)为什么在使用
->
时它会寻找这个方法,原因是什么?我在我的答案中附加了一些更多的信息,这些信息是从perl手册中复制的。希望能为您进一步解释。
Can't locate object method "SUPER" via package "MyOBJ" at test.pl line 45.