我无法理解如何将包符号导出到命名空间。我几乎完全遵循文档,但它似乎不知道任何导出符号。
mod.pm
#!/usr/bin/perl
package mod;
use strict;
use warnings;
require Exporter;
@ISA = qw(Exporter);
@EXPORT=qw($a);
our $a=(1);
1;
test.pl
$ cat test.pl
#!/usr/bin/perl
use mod;
print($a);
这是运行它的结果
$ ./test.pl
Global symbol "@ISA" requires explicit package name at mod.pm line 10.
Global symbol "@EXPORT" requires explicit package name at mod.pm line 11.
Compilation failed in require at ./test.pl line 3.
BEGIN failed--compilation aborted at ./test.pl line 3.
$ perl -version
This is perl, v5.8.4 built for sun4-solaris-64int
答案 0 :(得分:17)
它并没有告诉您导出$a
时遇到问题。它告诉您,您在声明@ISA
和@EXPORT
时遇到了问题。 @ISA
和@EXPORT
是包变量,在strict
下,需要使用our
关键字声明(或从其他模块导入 - 但这不太可能二)。它们在语义上与$a
不同 - 但功能不同 - 。
保姆注意: @EXPORT
不被视为有礼貌。通过Exporter
,它将其符号转储到using包中。有可能你认为某些东西有利于导出 - 并且 - 那么用户请求它是值得的。请改用@EXPORT_OK
。
答案 1 :(得分:15)
试试这个:
package mod; # Package name same as module.
use strict;
use warnings;
use base qw(Exporter);
our @ISA = qw(Exporter); # Use our.
our @EXPORT = qw($z); # Use our. Also $a is a bad variable name
# because of its special role for sort().
our $z = 1;
1;
答案 2 :(得分:7)
其他人已正确识别问题并提供解决方案。我认为指出一个调试技巧会很有用。要将问题隔离到给定文件,您可以尝试使用perl -c
编译该文件(请参阅perlrun):
perl -c mod.pm
这会给您相同的错误消息,导致您发现问题出在.pm
文件中,而不是.pl
文件中。