如何将包符号导出到Perl中的命名空间?

时间:2010-05-26 13:01:37

标签: perl module export

我无法理解如何将包符号导出到命名空间。我几乎完全遵循文档,但它似乎不知道任何导出符号。

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

3 个答案:

答案 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文件中。