our() asocia un nombre con una variable de
package, en el
package actual, para ser usado en el ámbito actual (que normalmente será todo el fichero).
Supongamos que tenemos un
único fichero así:
Using perl Syntax Highlighting
#!/usr/bin/perl
package configuracion;
use strict;
our %config = (
nv => 0,
'log' => 1,
az => 0,
logfile => 'C:/Users/we/Desktop/GG/llistasele/log.txt',
);
package main;
use strict;
use feature 'say';
say $config{'logfile'};
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí, %config es conocida porque ha sido definida en el mismo fichero. Aunque esté declarada y definida en otro
package, our() la hace visible a todo el fichero, sin tener que ser cualificada como %configuracion::config.
En cambio, si tenemos cada
package en un fichero distinto, el
package main no sabrá nada de %config. En ese caso necesitaremos, o bien referirnos a ella de forma completamente cualificada, o importamos su nombre a nuestro propio espacio de nombres.
Para el primer caso:
Using perl Syntax Highlighting
#!/usr/bin/perl
package main;
use strict;
use configuracion; # ahora Perl conoce el espacio de nombres configuracion::*
use feature 'say';
say $configuracion::config{'logfile'}; # accedemos a %config
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Para el segundo caso deberíamos usar el módulo Exporter y luego hacer una importación, pero quizás es muy lioso para un propósito muy simple de tener la configuración en un módulo aparte.
Alternativas más sencillas. Hacer un alias de la variable:
Using perl Syntax Highlighting
#!/usr/bin/perl
package main;
use strict;
use configuracion;
use feature 'say';
local *config = \%configuracion::config; # Extraño y demasiado complicado para el novato
say $::config{'logfile'}; # El $::config{} es la forma corta de $main::config{}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
O hacer una copia en un hash local:
Using perl Syntax Highlighting
#!/usr/bin/perl
package main;
use strict;
use configuracion;
use feature 'say';
my %config = %configuracion::config;
say $config{'logfile'};
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esto es más interesante: hacemos una copia del %config del
package a un %config propio del
package en donde estamos. Funciona, pero... es un poco chapucero.
Lo mejor es... importar, directamente, el código de %config en nuestro propio espacio de nombres. Para ello, modificamos el
package donde está %config, a:
Using perl Syntax Highlighting
# Definición de la configuración general
%config = (
nv => 0,
'log' => 1,
az => 0,
logfile => 'C:/Users/we/Desktop/GG/llistasele/log.txt',
);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
que, como ves, lo dejamos muy sencillo para que otra persona que no sepa mucho de Perl lo pueda modificar fácilmente. Y en el programa:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use feature 'say';
our %config; # necesario por la presencia del 'use strict'
do 'configuracion.pm'; # carga de la configuración
say $config{'logfile'}; # acceso a la variable
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya está. El do() realiza la carga e interpretación del fichero de configuración, haciendo que las variables declaradas y definidas en él pasen a nuestro programa.
do() tiene sus desventajas, como por ejemplo, que cada vez que se ejecuta vuelve a cargar e interpretar el contenido. Pero para este caso de un fichero de configuración, viene muy bien.
Más información en
perldoc -f our,
perldoc perlmod,
perldoc -f do (aquí viene un ejemplo completo de cómo realizar la carga de ficheros de configuración teniendo en cuenta todos los posibles valores que nos devuelva do(), en caso de fallo).
Por otra parte,
use vars es obsoleto. En su lugar hay que usar our().