2010-05-26 19 views
9

Mam problem ze zrozumieniem sposobu eksportowania symbolu pakietu do przestrzeni nazw. Podążyłem za dokumentacją prawie identycznie, ale wydaje się, że nie wiem o żadnym z eksportujących symboli.Jak wyeksportować symbol pakietu do przestrzeni nazw w Perlu?

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); 

Jest to wynikiem prowadzenia to

$ ./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 
+1

Dość starożytny Perl. Lepiej, jeśli możesz. – tsee

+1

stary system, utknąłem z nim – Mike

+1

Krótka wersja odpowiedzi poniżej jest już wyjaśniona w TFM: http://p3rl.org/Exporter#Good_Practices – daxim

Odpowiedz

17

Nie mówię, że masz problem z eksportowaniem $a. Informuje Cię, że masz problem z deklarowaniem @ISA i @EXPORT. @ISA i @EXPORT są zmiennymi pakietów i pod strict, muszą być zadeklarowane za pomocą słowa kluczowego our (lub importowane z innych modułów - ale nie jest to prawdopodobne z tymi dwoma). Są semantycznie różne - ale nie różnią się funkcjonalnie - od $a.

Niania UWAGA: nie jest uważana za uprzejmą. Poprzez Exporter zrzuca on symbole w pakiecie. Szanse są takie, że jesteś pewien, że coś jest dobre do wyeksportowania - i to jest - wtedy warto będzie, aby użytkownik o to poprosił. Zamiast tego użyj @EXPORT_OK.

14

Spróbuj tego:

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; 
6

Inni poprawnie zidentyfikowali problem i oferowane rozwiązania. Pomyślałem, że wskazane byłoby wskazanie końcówki debugowania. Aby wyizolować problem do danego pliku, możesz spróbować skompilować tylko ten plik używając perl -c (patrz perlrun):

perl -c mod.pm 

to dałby ci się ten sam komunikat o błędzie, co prowadzi do uświadomić sobie, że problem jest w Twój plik .pm, a nie Twój plik .pl.

Powiązane problemy