Как экспортировать символ пакета в пространство имен в Perl?

у меня возникли проблемы с пониманием, как экспортировать символ пакета в пространство имен. Я следил за документацией почти одинаково, но, похоже, не знаю ни об одном из экспортирующих символов.

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 ответов


это не говорит вам, что у вас возникли проблемы с экспортом $a. Это говорит вам, что у вас возникли проблемы с объявлением @ISA и @EXPORT. @ISA и @EXPORT переменные пакета и под strict, они должны быть объявлены с our ключевое слово (или импортировано из других модулей-но это маловероятно с этими двумя). Они семантически отличаются-но не функционально-от $a.

Примечание няни: @EXPORT не считается вежливым. Через Exporter он сбрасывает свои символы в пакет using. Скорее всего, если вы думаю, что-то хорошо экспортировать-и это is--тогда это будет стоить для пользователя, чтобы запросить его. Использовать @EXPORT_OK вместо.


попробуйте это:

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;

Другие правильно определили проблему и предлагаемые решения. Я подумал, что было бы полезно указать на совет по отладке. Чтобы изолировать проблему для данного файла, вы можете попытаться скомпилировать только этот файл с помощью perl -c(см. perlrun):

perl -c mod.pm

это дало бы вам такое же сообщение об ошибке, что приводит вас к пониманию проблемы в вашем .pm файл, а не ваш .