Как экспортировать символ пакета в пространство имен в 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
файл, а не ваш .