我在模块中定义了一个结构(使用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,或者即使我应该。你能帮忙吗?
答案 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