我可以在Perl中使用Exporter导出Struct吗?

时间:2014-08-21 01:14:12

标签: perl struct exporter

我在模块中定义了一个结构(使用Class:Struct),我对它如何导出到另一个模块感到困惑。

package MyPackage;
use Class::Struct;
use Exporter 'import';
@EXPORT = qw( function1 function2 );
struct(MyStruct=>{'type'=>'$', 'other'=>'$'});

现在,如果我将MyPackage包含在另一个模块中,我可以直接创建一个MyStruct变量:

package OtherPackage;
use MyPackage qw(function1 function2);
use Data::Dumper;

sub my_function {
    print Dumper(MyStruct);
}

如果我调用my_function,它会按预期打印出空结构。

然而,这是我的困惑,我不知道如何将它添加到@EXPORT,或者即使我应该。你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

出口商在这里不合适。你自己说过:你可以use MyPackage;并初始化MyStruct。你给出的例子,如果没有Class :: Struct的方便,就会看起来像这样:

package MyPackage;
use Exporter qw(import);
our @EXPORT = qw(function1 function2);
sub function1 { ... }
sub function2 { ... }
1;

package MyStruct;
sub new # Constructor
{ 
    my $self = shift; 
    my %args = @_;
    return bless(
        {
            'MyStruct::type'  => $args{type},
            'MyStruct::other' => $args{other},
        },
        $self,
    );
}

sub type # Setter/getter for type
{
    my ($self, $set) = shift;
    return $set ? $self->{type} = $set
                : $self->{type};
}

sub other # Setter/getter for other
{
    ... # So on and so forth
}
1;

区别在于Class :: Struct采用"蓝图"并为您编写MyStruct课程。来自perlobj:一个类只是一个包。类提供了期望对对象进行操作的方法。

将两个包放在一个文件中是很混乱的(这是Class :: Struct隐含的),所以你可以将它们分开。

MyPackage.pm:

package MyPackage;
use parent qw(Exporter);
our @EXPORT_OK = qw(function1 function2);
sub function1 { ... }
sub function2 { ... }
1;

MyStruct.pm:

package MyStruct;
use Class::Struct;
struct( 
    MyStruct => { 
        'type' => '$',
        'other' => '$'
    }
);
1;

您的问题并未明确,但如果MyPackage::function1()意图对MyStruct对象中包含的数据进行操作,则应完全废弃MyPackage并将其作为MyStruct中的方法提供:

package MyStruct;
use Class::Struct;
struct( 
    MyStruct => { 
        'type' => '$',
        'other' => '$'
    }
);
sub function1
{
    my $self = shift;
    print "This is function1 in $self\n";
}
1;

最后,不要从MyStruct中导出任何内容,只需像对象一样使用它:

use MyStruct;
my $instance = MyStruct->new( type => 'foo' ); # Instantiating
$instance->other('bar'); # Setting
print $instance->type;   # Getting