我有以下内容。
package A;
sub new {
my ($class) = @_;
my $self = { };
bless $self, $class;
return($self);
}
sub run() {
die "Task: ",__PACKAGE__, "requires a run method";
}
package B;
use A;
our @ISA = qw(A);
sub new {
my ($class) = @_;
my $self = { };
bless $self, $class;
return($self);
}
package C;
use A;
my @Tasks;
sub new {
my ($class) = @_;
my $self = { };
bless $self, $class;
return($self);
}
sub add{
my($self,$tempTask) = @_ ;
push(@Tasks,$tempTask);
$arraysize = @Tasks;
}
sub execute{
foreach my $obj (@Tasks)
{
$obj->run();
}
}
1;
脚本
#!/usr/local/bin/perl
use strict;
use C;
use B;
my $tb = new C();
my $task = new B();
$tb->add($task);
$tb->execute();
软件包B没有运行方法,因此它默认为我想要的运行方法。在这一点
当前它使用__PACKAGE__
变量打印出包装A。
有帮助吗?
一个对象是一个有福的参考。__PACKAGE__
将始终等于当前软件包的名称。但是ref( $object )
将为您提供对象类的名称。还有 Scalar::Util::blessed
,它不会为您提供非封闭引用的误报。
use Scalar::Util qw<blessed>;
my $obj = bless {}, 'A';
my $class = ref( {} ); # HASH
$class = blessed( {} ); # ''
$class = ref( $obj ); # A
$class = blessed( $obj ); # A
因此,在您的特殊情况下:
sub run() {
die "Task: " . ref( shift ) . "requires a run method";
}
用此...
替换A::run
代码 die "Task: ", ref shift, " requires a run method";
...将为您提供包(类)呼叫者对象属于的软件包的名称(作为对象上调用的每个方法的第一个参数是该对象本身,ref
将返回其className作为字符串)
caller()是此的一般答案,因为它可以为您提供所需的堆栈框架,包括包装名称。