我正在尝试将导入的函数传递给另一个创建的包。 也许有人可以帮助我:)
package Person;
use JSON; # i want to pass functions from this module to the package 'Employee'
sub new {
my $class = shift;
my $self = {
_name => "No Name",
};
bless $self, $class;
return $self;
}
sub setName {
my ($self, $name) = @_;
$self->{_name} = $name;
}
sub getName {
my $self = shift;
return $self->{_name};
}
1;
现在,我想使用此模块内JSON包中的函数。
package Employee;
use JSON qw( encode_json ); # This works, thx to everybody
our @ISA = qw(Person);
sub new {
my $class = shift;
my $self = Person->new();
encode_json({a=>1}); # this works now
bless $self, $class;
return $self;
}
1;
如果有人可以给我一些提示,我会很好。 谢谢大家
答案 0 :(得分:2)
您在问如何将encode_json
放置在Employee
名称空间中。为此,请在package Employee;
之后添加以下内容:
use JSON qw( encode_json );
答案 1 :(得分:2)
我也不确定为什么OP在评论中说他/她不能(或不想)在Employee包中放入“ use JSON”。可能是因为Employee包文件(Employee.pm)是由其他人编写的,无法修改。
请注意,在Perl中,您可以使用任何文件中编写的任何其他代码“打开Employee”包。因此,在您的主脚本或Person包文件中或任何地方,您都可以执行以下操作:
{ package Employee; use JSON; }
答案 2 :(得分:2)
如果由于不确定是否需要使用哪种编码,所以绝对不能将use JSON
添加到Employee类中,那么可以将代码引用传递给new
:
# in Person.pm
my $e = Employee->new(\&JSON::encode_json);
# in Employee.pm
sub new {
my($class, $encoder) = @_;
...
$self->{_encoded} = $encoder->($value_to_encode);
...
return $self;
}
同样,您要这样做的唯一原因是,如果您动态地需要更改要使用的编码器。如果您想要一种功能而无需更改它,那么您采用的解决方案use JSON qw(encode_json)
是正确的。