Perl类变量用法

Joh*_*ohn 3 perl

我试图了解如何在Perl OO中使用实例变量 - 更具体地说,与外部资源结合使用.让我解释:

我们有一个DLL,它暴露了我想通过Perl API公开的一些功能.我使用Win32 :: OLE来访问此DLL.所以我的构造函数很简单:

package MY_CLASS;
use Win32::OLE;

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

    # instantiate the dll control
    my $my_dll = Win32::OLE->new("MY_DLL.Control");

    my $self = {
        MY_DLL => \$my_dll,
    };

    bless $self, $class or die "Can't bless $!";
    return $self;
}

sub DESTROY
{
    my ($self) = shift;
    undef $sef->{MY_DLL};
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在为实例变量MY_DLL分配引用$my_dll.我有几个问题:

1)如何调用实例变量,因为它指向引用.那么,换句话说,如何在实例化的dll上调用方法,如下所示:

my $dll_class = new MY_CLASS;
$dll_class->{MY_DLL}->launch();
Run Code Online (Sandbox Code Playgroud)

假设launch()是由dll公开的方法.但是由于{MY_DLL}指向一个引用,Perl抱怨这是可以理解的.语法是什么?

2)我是否需要特别undef在DESTROY?即使我不具体,undef它也会自动清理Perl 吗?

rjh*_*rjh 9

1)在调用之前取消引用引用:

${$dll_class->{MY_DLL}}->launch();
Run Code Online (Sandbox Code Playgroud)

通过使用\$,您将采用标量参考.${...}是标量参考操作.

我不确定为什么你需要使用对引用的引用 - 你可以简单地设置MY_DLL $my_dll,因为它已经是一个引用:

# ...
my $self = {
    MY_DLL => $my_dll,  # note, the \ is no longer in front of $my_dll
};
# ...
Run Code Online (Sandbox Code Playgroud)

然后你可以用原始语法调用它:

$dll_class->{MY_DLL}->launch();
Run Code Online (Sandbox Code Playgroud)

2)Perl会自动清理没有引用指向它的任何东西.当你的对象被销毁时,\$my_dll将不再有对它的引用,因此也不会引用它,因此$my_dll它将被自动销毁.

通常,只需要担心是否有指向自身的递归数据结构.在这些情况下,您可以DESTROY手动断开链接; 在您的情况下,您不需要将句柄显式设置为undef.

有关参考的更多信息,请参阅perlref.有关垃圾收集,DESTROY方法和循环引用的信息,请参阅perlobj的"Destructors"部分.