2010-01-21 19 views

Respuesta

8

Ya existe una standard Config module, así que elija un nombre diferente.

Digamos que tiene MyConfig.pm con el siguiente contenido:

package MyConfig; 

our $Foo = "bar"; 

our %Baz = (quux => "potrzebie"); 

1; 

A continuación, otros módulos podrían usarlo como en

#! /usr/bin/perl 

use warnings; 
use strict; 

use MyConfig; 

print "Foo = $MyConfig::Foo\n"; 

print $MyConfig::Baz{quux}, "\n"; 

Si no desea calificar totalmente los nombres, a continuación, utilizar el módulo estándar Exporter en su lugar.

Añadir tres líneas de MyConfig.pm:

package MyConfig; 

require Exporter; 
our @ISA = qw/ Exporter /; 
our @EXPORT = qw/ $Foo %Baz /; 

our $Foo = "bar"; 

our %Baz = (quux => "potrzebie"); 

1; 

Ahora, el nombre completo del paquete ya no es necesario:

#! /usr/bin/perl 

use warnings; 
use strict; 

use MyConfig; 

print "Foo = $Foo\n"; 

print $Baz{quux}, "\n"; 

Se podría añadir un solo lectura escalares a MyConfig.pm con

our $READONLY; 
*READONLY = \42; 

Esto está documentado en perlmod.

Después de añadirlo a @MyConfig::EXPORT, puede intentar

$READONLY = 3; 

en un módulo diferente, pero obtendrá

Modification of a read-only value attempted at ./program line 12.

Como alternativa, se puede declarar en MyConfig.pm constantes utilizando el constant módulo y luego exportar esos.

+2

En lugar de heredar de 'Exporter', puedes simplemente agarrar su método de 'importación', que es todo lo que realmente necesitas. p.ej. 'use Exporter 'import';' – friedo

4

No utilice variables globales para la configuración y no cifre la configuración como código. Tengo un capítulo completo en Mastering Perl sobre esto.

En su lugar, cree una clase de configuración que cualquier otro paquete pueda usar para acceder a los datos de configuración. Será mucho más fácil a largo plazo proporcionar una interfaz para algo que quizás desee cambiar más tarde que lidiar con la locura en la que se encierra dispersando nombres de variables que debe respaldar por el resto de su vida.

Una interfaz de configuración también le ofrece la ventaja de componer nuevas respuestas a las preguntas de configuración combinando los bits correctos de los datos de configuración reales. Ocultas todo eso detrás de un método y los niveles superiores no tienen que ver cómo se implementa. Por ejemplo,

print "Hello!" unless $config->be_silent; 

El be_silent respuesta puede ser desencadenada por múltiples razones el código de nivel superior no necesita conocer. Podría ser desde un cambio de usuario, que el programa detectó que no es interactivo, y así sucesivamente. También puede ser volteado por opciones como un interruptor de depuración, que anula todas las demás preferencias.No importa lo que decida, esa línea de código no cambia porque a esa afirmación solo le importa la respuesta, no cómo obtuvo la respuesta.

Cuestiones relacionadas