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

person Mike    schedule 26.05.2010    source источник
comment
Довольно древний Perl. Вам лучше обновиться, если вы можете.   -  person tsee    schedule 26.05.2010
comment
устаревшая система, я застрял с ней   -  person Mike    schedule 26.05.2010
comment
Краткая версия ответов ниже уже объяснена в TFM: p3rl.org/Exporter#Good_Practices   -  person daxim    schedule 26.05.2010
comment
$a (и $b) не являются хорошими переменными для использования. Приведите их для сортировки.   -  person runrig    schedule 26.05.2010
comment
в производственном коде я, очевидно, использую лучшие имена. для целей этого примера я пытался сделать его простым   -  person Mike    schedule 26.05.2010


Ответы (3)


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

Няня ПРИМЕЧАНИЕ: @EXPORT не считается вежливым. Через Exporter он выгружает свои символы в использующий пакет. Скорее всего, если вы считаете, что что-то нужно экспортировать — а это так и есть, — то пользователю стоит запросить это. Вместо этого используйте @EXPORT_OK.

person Axeman    schedule 26.05.2010

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

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;
person FMc    schedule 26.05.2010

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

perl -c mod.pm

Это дало бы вам такое же сообщение об ошибке, заставив вас понять, что проблема в вашем файле .pm, а не в файле .pl.

person toolic    schedule 26.05.2010