有没有办法在perl中获取特定类的对象?
示例:
use <class1>;
use <class2>
sub Main {
my $call1 = <class1>->new(<ARGS>)->(<Routine call>);
my $call2 = <class1>->new(<ARGS>)->(<Routine call>);
my $call3 = <class1>->new(<ARGS>)->(<Routine call>);
.
.
.
my $call4 = <class2>->new(<ARGS>)->(<Routine call>);
}
是否可以获取<class1>
的对象?
$call1
$call2
and
$call3
答案 0 :(得分:3)
这里有一些指示: How can I list all variables that are in a given scope?
使用此工具:http://search.cpan.org/dist/PadWalker/PadWalker.pm,您可以访问给定范围内的所有包和词汇变量。
或者您也可以直接访问符号表以获取给定范围:keys %{'main::'}
您可以使用ref()
获取变量的类型/类。 http://perldoc.perl.org/functions/ref.html
我认为没有针对您的问题的直接解决方案。
也许您可以扩展类并将实例收集到重写的构造函数中的哈希表。
答案 1 :(得分:2)
通常的技术是以这样一种方式编写Class1
,使得它的构造函数对某个数组或哈希中构造的每个对象保持一个(可能是弱的)引用。如果您正在使用Moose,那么有一个名为MooseX :: InstanceTracking的扩展程序可以很容易地实现:
package Class1 {
use Moose;
use MooseX::InstanceTracking;
# ... methods, etc here.
}
package Class2 {
use Moose;
extends 'Class1';
}
my $foo = Class1->new;
my $bar = Class1->new;
my $baz = Class2->new;
my @all = Class1->meta->get_all_instances;
如果你不使用Moose;然后它仍然很容易:
package Class1 {
use Scalar::Util qw( weaken refaddr );
my %all;
sub new {
my $class = shift;
my $self = bless {}, $class;
# ... initialization stuff here
weaken( $all{refaddr $self} = $self );
return $self;
}
sub get_all_instances {
values %all;
}
sub DESTROY {
my $self = shift;
delete( $all{refaddr $self} );
}
# ... methods, etc here.
}
package Class2 {
our @ISA = 'Class1';
}
my $foo = Class1->new;
my $bar = Class1->new;
my $baz = Class2->new;
my @all = Class1->get_all_instances;