2009-10-11 9 views
5

Tengo una pregunta relacionada con Perl y el alcance. Tengo un archivo común con muchas variables diferentes. Necesito el archivo común en mi script principal, pero no puedo acceder a las variables; parecen estar fuera de su alcance. Supuse que una declaración our resolvería ese problema, pero parece que no funciona.¿Por qué mi secuencia de comandos de Perl no puede ver las variables our() que definí en otro archivo?

Guión 1: common.pl

#!/usr/bin/perl 

our $var1 = "something"; 
our $var2 = "somethingelse"; 

Guión 2: ftp.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

require('common.pl'); 

print $var1; 

me sale el error:

Global symbol "$var1" requires explicit package name

+3

El símbolo global, $ var1, requiere un nombre de paquete explícito. – jrockway

+1

Lea http://perl.plover.com/FAQs/Namespaces.html –

+0

El elemento 1 de la Programación efectiva de Perl (ISBN: 0201419750, Joseph Hall y Randal Schwartz) se titula: Conozca sus espacios de nombres. Es una referencia excelente para esto, y un gran libro, también. –

Respuesta

8

No hay require declaración en su segundo ejemplo, pero no funcionaría de todos modos. Lo que hace our es declarar una variable de paquete de ámbito léxico. Como no tiene ninguna declaración package, usa el paquete predeterminado main. Por lo tanto, su primer script configura la variable $main::var1, pero esto solo estará disponible dentro del alcance de ese archivo.

Una mejor manera de proporcionar variables comunes para otros scripts es usar Exporter. Puede definir símbolos de paquete en un solo lugar y Exporter se encargará de copiarlos al script de solicitud o al espacio de nombres de la clase cuando sea necesario.

6

Parece que necesita un archivo de configuración adecuado allí. Buscaría un archivo de configuración sin código que pueda leer cuando necesite configurar cosas. Hay módulos en CPAN para manejar casi cualquier formato de configuración que puedas imaginar.

Si quiere hacerlo de la forma en que lo tiene, deshágase de our y repórtelos con use vars. No dejes que la policía de PBP te asuste de eso. :) Solo necesita our para limitar el alcance de una variable de paquete, y eso es exactamente lo contrario de lo que intenta hacer.

+0

Bueno, usar estricto no me permitirá no usar una definición variable como nuestra o mi. – Lee

+0

Existe un problema de que estoy trabajando en versiones de Perl que no se pueden modificar ... p. sin nuevos módulos – Lee

+0

Si puede agregar archivos perl, puede usar todos los módulos perl puros, es un poco complicado ya que tiene que encargarse usted mismo de las dependencias. Simplemente descargue la fuente del módulo que desea y colóquelo donde "su" perlscript puede leerlo. – Nifle

7

Me gustaría poner la configuración en un módulo en su lugar.

del archivo: MyConfig.pm

package MyConfig; 
require Exporter; 
use strict; 

our @ISA    = qw(Exporter); 
our @EXPORT    = qw(getconfig); 

my %confighash = ( 
      thisone => 'one', 
      thatone => 2, 
      somthingelse => 'froboz', 
        ); 



sub getconfig { 
return %confighash; 
} 

1; 

Ejemplo de uso:

#!/usr/bin/perl 
use strict; 
use warnings; 

use MyConfig; 

my %config = getconfig(); 

print $config{ somthingelse }; 

Esto debería imprimir Froboz

2

nuestra() hace algo un poco diferente de lo que piensa. Su único propósito es trabajar estrictamente para exigirle que declare las variables del paquete que va a utilizar (a menos que sean totalmente calificadas o importadas). Como estricto, su efecto tiene un alcance léxico. Para usarlo para permitir el acceso a un $main:var1 global desde varios archivos (que son ámbitos independientes) como solo $var1, necesita decir our $var1 en cada archivo.

Alternativamente, podría cambiar el archivo requerido para que sea un módulo con su propio paquete que exporte las variables a cualquier paquete que lo use.

1

Pruebe esto.Soy nuevo en Perl, pero esto es cómo llegué a trabajar en un guión que hice

#!/usr/bin/perl 

$var1 = "something"; 
$var2 = "somethingelse"; 
Script 2: ftp.pl 

#!/usr/bin/perl 

use strict; 
use warnings; 

our $var1; 
our $var2; 

require('common.pl'); 

print $var1; 
Cuestiones relacionadas