我试图在一些子类中拦截不存在的方法调用.是的,我知道AUTOLOAD,但是(对于方法)它首先尝试调用parent :: method,然后调用UNIVERSAL :: method然后才调用:: AUTOLOAD.但我首先需要调用(例如):: AUTOLOAD.因为我想知道子类尝试从父调用什么方法.
请给我一些建议.
AUTOLOAD为什么不在子类包中创建一个子类,它 1)报告缺少的方法,然后 2)将调用分派给父类。为此,您没有@ISA在子类中定义它。
就像是:
package my_parent;
sub foo { warn "in my_parent::foo" }
package my_subclass;
my $PARENT_CLASS = "my_parent"; # assume only one parent
# Note: no @ISA defined here
sub AUTOLOAD {
warn "non-existent method $AUTOLOAD called\n";
my $self = shift;
(my $method = $AUTOLOAD) =~ s{.*::}{};
my $super = $PARENT_CLASS . '::' . $method;
$self->$super(@_);
}
package main;
my $x = bless {}, 'my_subclass';
$x->foo;
Run Code Online (Sandbox Code Playgroud)
语法:$self->$super(@_)where $superhas 双冒号告诉 perl 在哪个包中开始寻找该方法,例如:
$self->my_parent::foo(...)
Run Code Online (Sandbox Code Playgroud)
无论被祝福到哪个类,都会foo从包中开始查找方法。my_parent$self