如何从自定义模块中正确导入函数
How to correctly import a function from a custom module
我需要一些关于如何从 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 行调用。
为获得最佳结果,您使用的包名称应与您提供给 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;
我怀疑您没有共享您实际使用的代码,因为我没有收到您描述的错误,但我收到了很多其他错误。
我得到的错误都是由于混淆了模块路径和包名称之间的 link。因为您的模块文件位于名为 "Person" 的目录中,所以它们实际上应该称为 "Person::Person" 和 "Person::PersonInit"。您似乎意识到在加载模块时 (use Person::Person
) 但在命名包时 (package Person
) 或调用 class 方法时 (Person->new(...)
) .
在我编辑您的文件以始终如一地使用正确的包名称后,一切都按预期进行。
我会注意到您同时定义了 @EXPORT
和 @EXPORT_OK
。您导出的子程序只需要在其中之一。
我正在使用 Perl 5.26.1。从您问题的标签来看,您似乎使用的是 5.8.something (我猜它可能是 5.8.8)。有可能您遇到了一个错误,该错误已在该版本发布后的 13 年中得到修复 - 但是,老实说,我不记得听说过任何类似的事情。无论如何,我强烈建议您升级到更新版本的 Perl。
我需要一些关于如何从 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 行调用。
为获得最佳结果,您使用的包名称应与您提供给 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;
我怀疑您没有共享您实际使用的代码,因为我没有收到您描述的错误,但我收到了很多其他错误。
我得到的错误都是由于混淆了模块路径和包名称之间的 link。因为您的模块文件位于名为 "Person" 的目录中,所以它们实际上应该称为 "Person::Person" 和 "Person::PersonInit"。您似乎意识到在加载模块时 (use Person::Person
) 但在命名包时 (package Person
) 或调用 class 方法时 (Person->new(...)
) .
在我编辑您的文件以始终如一地使用正确的包名称后,一切都按预期进行。
我会注意到您同时定义了 @EXPORT
和 @EXPORT_OK
。您导出的子程序只需要在其中之一。
我正在使用 Perl 5.26.1。从您问题的标签来看,您似乎使用的是 5.8.something (我猜它可能是 5.8.8)。有可能您遇到了一个错误,该错误已在该版本发布后的 13 年中得到修复 - 但是,老实说,我不记得听说过任何类似的事情。无论如何,我强烈建议您升级到更新版本的 Perl。