2010-01-21 7 views

risposta

8

C'è già un standard Config module, quindi scegliere un nome diverso.

Diciamo che hanno MyConfig.pm con il seguente contenuto:

package MyConfig; 

our $Foo = "bar"; 

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

1; 

Poi altri moduli potrebbero usarlo come in

#! /usr/bin/perl 

use warnings; 
use strict; 

use MyConfig; 

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

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

Se non si vuole qualificare completamente i nomi, quindi utilizzare il invece il modulo standard Exporter.

Aggiungi tre linee di MyConfig.pm:

package MyConfig; 

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

our $Foo = "bar"; 

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

1; 

Ora il nome completo del pacchetto è più necessario:

#! /usr/bin/perl 

use warnings; 
use strict; 

use MyConfig; 

print "Foo = $Foo\n"; 

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

Si potrebbe aggiungere una sola lettura scalari per MyConfig.pm con

our $READONLY; 
*READONLY = \42; 

Questo è documentato in perlmod.

Dopo aver aggiunto a @MyConfig::EXPORT, si potrebbe provare

$READONLY = 3; 

in un modulo diverso, ma si otterrà

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

In alternativa, si potrebbe dichiarare MyConfig.pm costanti utilizzando il constant modulo e quindi esportare quelli.

+2

Invece di ereditare da "Exporter', puoi semplicemente prendere il suo metodo" import', che è tutto ciò di cui hai veramente bisogno. per esempio. 'usa 'importazione' Esportatore;' – friedo

4

Non utilizzare variabili globali per la configurazione e non eseguire la configurazione di sotre come codice. Ho un intero capitolo in Mastering Perl su questo.

Invece, creare una classe di configurazione che qualsiasi altro pacchetto possa utilizzare per accedere ai dati di configurazione. Sarà molto più facile, a lungo andare, fornire un'interfaccia a qualcosa che potresti voler cambiare in seguito piuttosto che occuparti del nettiness in cui ti rinchiudi spargendo i nomi delle variabili che devi supportare per il resto della tua vita.

Un'interfaccia di configurazione offre anche il vantaggio di comporre nuove risposte alle domande di configurazione combinando i bit corretti dei dati di configurazione effettivi. Si nasconde tutto ciò dietro un metodo e i livelli superiori non devono vedere come è implementato. Per esempio,

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

La be_silent risposta può essere attivato per diverse ragioni il codice di livello superiore non ha bisogno di conoscere. Potrebbe essere da un interruttore utente, che il programma ha rilevato che non è interattivo e così via. Può anche essere capovolto da opzioni come un interruttore di debug, che sovrascrive tutte le altre preferenze.Qualunque cosa tu decida, quella linea di codice non cambia perché a questa affermazione interessa solo la risposta, non come hai ottenuto la risposta.

Problemi correlati