2015-08-06 27 views
7

Sto cercando il modo più efficiente e leggibile per esportare tutte le costanti dal mio modulo separato, che viene utilizzato solo per la memorizzazione delle costanti.
Per esempioQual è il modo più efficiente per esportare tutte le costanti (variabili di sola lettura) dal modulo Perl

use strict; 
use warnings; 

use Readonly; 

Readonly our $MY_CONSTANT1   => 'constant1'; 
Readonly our $MY_CONSTANT2 => 'constant2'; 
.... 
Readonly our $MY_CONSTANT20 => 'constant20'; 

quindi ho un sacco di variabili, e per elencarli tutti all'interno della nostra @EXPORT = qw(MY_CONSTANT1....);
Sarà doloroso. C'è un modo elegante per esportare tutte le costanti, nel mio caso le variabili di Readonly (forza l'esportazione di tutto, senza usare @EXPORT_OK).

risposta

4

costanti effettivi:

use constant qw(); 
use Exporter qw(import);  

our @EXPORT_OK; 

my %constants = (
    MY_CONSTANT1 => 'constant1', 
    MY_CONSTANT2 => 'constant2', 
    ... 
); 

push @EXPORT_OK, keys(%constants); 
constant->import(\%constants); 

variabili messe di sola lettura con Readonly:

use Exporter qw(import); 
use Readonly qw(Readonly); 

our @EXPORT_OK; 

my %constants = (
    MY_CONSTANT1 => 'constant1', 
    MY_CONSTANT2 => 'constant2', 
    #... 
); 

for my $name (keys(%constants)) { 
    push @EXPORT_OK, '$'.$name; 
    no strict 'refs'; 
    no warnings 'once'; 
    Readonly($$name, $constants{$name}); 
} 
+0

Versione di Readonly aggiunta. – ikegami

+0

Risolto un errore di battitura, messo a tacere un avviso spuria e ottimizzato leggermente. – ikegami

+0

Grazie per la risposta puoi fornire un esempio di utilizzo delle costanti in entrambi i casi? – CROSP

5

Se queste sono le costanti che possono avere bisogno di essere interpolato in stringhe, ecc, prendere in considerazione il raggruppamento delle costanti correlate in un hash e creazione della costante dell'hash utilizzando Const::Fast. Ciò riduce l'inquinamento dello spazio dei nomi, consente di ispezionare tutte le costanti in un gruppo specifico, ecc. Ad esempio, considerare i valori di enumerazione READYSTATE per la proprietà ReadyState di IE. Invece di creare una variabile indipendente, o una funzione costante separato per ogni valore, si potrebbe raggrupparli in un hash:

package My::Enum; 

use strict; 
use warnings; 

use Exporter qw(import); 
our @EXPORT_OK = qw(%READYSTATE); 

use Const::Fast; 

const our %READYSTATE => (
    UNINITIALIZED => 0, 
    LOADING => 1, 
    LOADED => 2, 
    INTERACTIVE => 3, 
    COMPLETE => 4, 
); 

__PACKAGE__; 
__END__ 

E, poi, si può intuitivamente usarli come in:

use strict; 
use warnings; 

use My::Enum qw(%READYSTATE); 

for my $state (sort { $READYSTATE{$a} <=> $READYSTATE{$b} } keys %READYSTATE) { 
    print "READYSTATE_$state is $READYSTATE{$state}\n"; 
} 

See anche Neil Bowers' excellent review on 'CPAN modules for defining constants'.

+0

Ah fantastico! Scusate. – ikegami