Как я экспортирую символ пакета в пространство имен в 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
9
задан brian d foy 26 May 2010 в 14:15
поделиться

3 ответа

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

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

17
ответ дан 4 December 2019 в 06:22
поделиться

Попробуйте следующее:

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;
15
ответ дан 4 December 2019 в 06:22
поделиться

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

perl -c mod.pm

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

7
ответ дан 4 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: