Perl:获取特定类的对象

时间:2013-12-26 10:36:38

标签: perl object

有没有办法在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

2 个答案:

答案 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;