将导入的函数传递给Perl中的另一个包

时间:2018-12-20 17:05:51

标签: perl oop

我正在尝试将导入的函数传递给另一个创建的包。 也许有人可以帮助我:)

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;

如果有人可以给我一些提示,我会很好。 谢谢大家

3 个答案:

答案 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)是正确的。