Reputation: 60743
I'm having trouble understanding how to export a package symbol to a namespace. I've followed the documentation almost identically, but it seems to not know about any of the exporting symbols.
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);
This is the result of running it
$ ./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
Upvotes: 9
Views: 5353
Reputation: 29844
It's not telling you that you're having a problem exporting $a
. It's telling you that you're having a problem declaring @ISA
and @EXPORT
. @ISA
and @EXPORT
are package variables and under strict
, they need to be declared with the our
keyword (or imported from other modules--but that is not likely with those two). They are semantically different--but not functionally different--from $a
.
Nanny NOTE: @EXPORT
is not considered polite. Through Exporter
it dumps its symbols in the using package. Chances are if you think something is good to export--and it is--then it will be worth it for the user to request it. Use @EXPORT_OK
instead.
Upvotes: 17
Reputation: 61977
Others have correctly identified the problem and offered solutions. I thought it would be useful to point out a debugging tip. To isolate a problem to a given file, you can attempt to compile just that file using perl -c
(refer to perlrun):
perl -c mod.pm
This would have given you the same error message, leading you to realize the problem is in your .pm
file, not your .pl
file.
Upvotes: 7
Reputation: 42411
Try this:
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;
Upvotes: 15