2010-05-26 15 views
9

Tengo problemas para entender cómo exportar un símbolo de paquete a un espacio de nombres. He seguido la documentación casi de manera idéntica, pero parece que no sé sobre ninguno de los símbolos de exportación.¿Cómo exporto un símbolo de paquete a un espacio de nombres en 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); 

Este es el resultado de la ejecución que

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

Pretty ancient Perl. Será mejor que actualices si puedes. – tsee

+1

sistema heredado, estoy atascado con él – Mike

+1

La versión corta de las respuestas a continuación ya se explica en TFM: http://p3rl.org/Exporter#Good_Practices – daxim

Respuesta

17

No le está diciendo que tiene problemas para exportar $a. Le está diciendo que tiene un problema al declarar @ISA y @EXPORT. @ISA y @EXPORT son variables de paquete y bajo strict, deben declararse con la palabra clave our (o importarse desde otros módulos, pero eso no es probable con esos dos). Son semánticamente diferentes, pero no funcionalmente diferentes, desde $a.

Niñera NOTA:@EXPORT no se considera cortés. A través de Exporter vacia sus símbolos en el paquete using. Lo más probable es que piense que algo es bueno para exportar, y es, entonces valdrá la pena para que el usuario lo solicite. Use @EXPORT_OK en su lugar.

14

Prueba esto:

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

Otros han identificado correctamente el problema y ofrecido soluciones. Pensé que sería útil señalar una sugerencia de depuración. Para aislar un problema con un archivo determinado, se puede intentar compilar solamente ese archivo usando perl -c (consulte la perlrun):

perl -c mod.pm 

Esto le habría dado el mismo mensaje de error, que le conduce a darse cuenta de que el problema es en su archivo .pm, no su archivo .pl.

Cuestiones relacionadas