0

我需要一些关于如何从 perl 中的自定义模块正确导入函数的线索。(这里是来自 PersonInit 模块的 person_init)。

这是我的文件夹表示:

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;

所以当我尝试启动时,我遇到了这个错误:

在 D:\Workspace\Mapping\TestObject.pl 第 8 行调用的未定义子例程 &main::Person_Init。

4

2 回答 2

3

为获得最佳结果,您使用的包名称应与您提供给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;
于 2019-09-19T12:56:46.560 回答
1

我怀疑您没有共享您实际使用的代码,因为我没有收到您描述的错误,但我收到了大量其他错误。

我得到的错误都归结为模块路径和包名称之间的链接混淆。因为您的模块文件位于名为“Person”的目录中,所以它们实际上应该被称为“Person::Person”和“Person::PersonInit”。您似乎意识到,当您加载模块时 ( use Person::Person) 而不是在命名包 ( package Person) 或调用类方法 ( Person->new(...)) 时。

一旦我编辑了您的文件以始终使用正确的包名称,一切都按预期工作。

我会注意到您同时定义了@EXPORT@EXPORT_OK。您导出的子例程只需要在其中之一中。

我正在使用 Perl 5.26.1。从您问题上的标签来看,您似乎正在使用 5.8.something (我猜它可能是 5.8.8)。您可能会遇到自该版本发布以来已在 13 多年内修复的错误 - 但老实说,我不记得听说过类似的事情。无论如何,我强烈建议您升级到更新版本的 Perl。

于 2019-09-19T13:07:37.450 回答