Как правильно импортировать функцию из пользовательского модуля - PullRequest
0 голосов
/ 19 сентября 2019

Мне нужно понять, как правильно импортировать функцию из пользовательского модуля в Perl.(здесь person_init из модуля PersonInit).

Это мое представление папки:

TestObject.pl
Person/Person.pm
Person/PersonInit.pm

Вот код TestObject.pl

use FindBin 1.44 qw( $RealBin );
use lib $RealBin;
use warnings;        # Avertissement des messages d'erreurs
use strict;  
use Person::PersonInit;

person_init();
print('toto');

в Person.pm:

package Person;    # Nom du package, de notre classe
use warnings;        # Avertissement des messages d'erreurs
use strict;          # Vérification des déclarations
use Carp;            # Utile pour émettre certains avertissements
sub new {
  my ( $classe, $ref_arguments ) = @_;

  # Vérifions la classe
  $classe = ref($classe) || $classe;

  # Création de la référence anonyme de hachage vide (futur objet)
  my $this = {};

  # Liaison de l'objet à la classe
  bless $this, $classe;

  if (! ( defined $ref_arguments->{nom} )) {
    $ref_arguments->{nom} = 'inconnu';
  }

  $this->{_NOM}          = $ref_arguments->{nom};
  $this->{_PRENOM}       = $ref_arguments->{prenom};
  $this->{_TEL}           = $ref_arguments->{tel};
  $this->{_MAIL}           = $ref_arguments->{mail};
  $this->{_GRADE}           = $ref_arguments->{grade};
  $this->{_SEXE}         = $ref_arguments->{sexe};
  $this->{_SERVICE}         = $ref_arguments->{service};

  return $this;
}
1;                # Important, à ne pas oublier
__END__ 

и в PersonInit.pm:

#/usr/bin/perl
package PersonInit;
use strict;
use POSIX;
use warnings;

use FindBin 1.44 qw( $RealBin );
use lib $RealBin;
use Person::Person;
use Exporter;

our @ISA= qw( Exporter );

# these CAN be exported.
our @EXPORT_OK = qw( person_init );

# these are exported by default.
our @EXPORT = qw( person_init );



sub person_init {
my ($arg) = @_;
my $Person = Person->new({
    prenom        => 'Jean',
    sexe          => 'M',
    tel => '3',
    mail  => '4',
        grade  => 'g',
        service  => 's',
  });
  print ($Person->{_NOM});
  print ('toto');
  return $Person;
 };

1;

Поэтому, когда я пытаюсь запустить t, у меня появляется эта ошибка:

Неопределенная подпрограмма & main:: Person_Init вызывается в строке D: \ Workspace \ Mapping \ TestObject.pl 8.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

Для достижения наилучших результатов используемые вами имена пакетов должны совпадать с именами пакетов, которые вы указываете в директиве use.Используйте

package Person;
...
package PersonInit;
...
use Person;
use PersonInit;

или

package Person::Person;
...
package Person::PersonInit;
...
use Person::Person;
use Person::PersonInit;

, но не

package Person;
...
package PersonInit;
...
use Person::Person;
use Person::PersonInit;
1 голос
/ 19 сентября 2019

Я подозреваю, что вы не передаете код, который вы на самом деле используете, так как я не получаю описанную вами ошибку, но я получаю множество других ошибок.

Ошибки, которые яЯ получаю все путаницы по поводу связи между путями модулей и именами пакетов.Поскольку файлы вашего модуля находятся в каталоге с именем «Person», они должны называться «Person :: Person» и «Person :: PersonInit».Кажется, вы понимаете, что когда вы загружаете модули (use Person::Person), но не когда называете пакеты (package Person) или вызываете методы класса (Person->new(...)).

После того, как я отредактировалваши файлы постоянно используют правильные имена для пакетов, все работает как положено.

Я отмечу, что вы определяете как @EXPORT, так и @EXPORT_OK.Ваша экспортированная подпрограмма должна быть только в одном из них.

Я использую Perl 5.26.1.Судя по тэгам на ваш вопрос, кажется, что вы используете 5.8. (Думаю, это будет 5.8.8).Возможно, вы столкнулись с ошибкой, которая была исправлена ​​за тринадцать лет с момента выпуска этой версии, но, честно говоря, я не припоминаю слышать о чем-либо подобном.В любом случае, я призываю вас перейти на более новую версию Perl.

...