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