Передача импортированных функций в другой пакет в Perl - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь передать импортированные функции в другой созданный пакет.Может быть, кто-то может мне помочь:)

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 голосов
/ 20 декабря 2018

Я также не уверен, почему в комментарии OP было сказано, что он / она не может (или не хочет) добавить «use JSON» в пакет Employee.Возможно, потому что файл пакета Employee (Employee.pm) написан кем-то другим и не может быть изменен.

Обратите внимание, что в Perl вы можете «открыть пакет Employee» из любого другого кода, написанного в любом файле.Таким образом, в вашем основном скрипте или в файле пакета Person или где угодно, вы можете сделать:

{ package Employee; use JSON; }
0 голосов
/ 20 декабря 2018

Если вы абсолютно не можете добавить 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;
}

Опять же, причина only , которую вы хотели бы сделать, заключается в том, что вам нужно динамически менять кодер, который вы хотите использовать.Решение, которое вы приняли - use JSON qw(encode_json) - является правильным, если вам нужна эта функция и вам не нужно ее менять.

0 голосов
/ 20 декабря 2018

Вы спрашиваете, как поместить encode_json в пространство имен Employee.Для этого добавьте следующее после package Employee;:

use JSON qw( encode_json );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...