2015-08-06 18 views
7

Szukam najbardziej wydajnego i czytelnego sposobu eksportu wszystkich stałych z mojego osobnego modułu, który jest używany tylko do przechowywania stałych.
Na przykładJaki jest najskuteczniejszy sposób eksportowania wszystkich stałych (zmienne tylko do odczytu) z modułu Perla

use strict; 
use warnings; 

use Readonly; 

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

Więc mam wiele zmiennych, a do listy ich wszystkich wewnątrz nasz @EXPORT = qw(MY_CONSTANT1....);
To będzie bolesne. Czy istnieje elegancki sposób eksportowania wszystkich stałych, w moim przypadku zmienne Readonly (wymuszaj eksport wszystkich, bez użycia @EXPORT_OK).

Odpowiedz

4

Rzeczywiste stałe:

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); 

Zmienne tylko do odczytu z 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

Dodano wersję Readonly. – ikegami

+0

Poprawiono literówkę, wyciszono fałszywe ostrzeżenie i nieznacznie zoptymalizowano. – ikegami

+0

Dzięki za odpowiedź możesz podać przykład użycia stałych w obu przypadkach? – CROSP

5

Jeśli są stałe, które mogą wymagać, aby być interpolowane do strun itp rozważyć grupowanie powiązanych stałe w hash, i uczynienie mieszania stałym za pomocą Const::Fast. Zmniejsza to zanieczyszczenie przestrzeni nazw, umożliwia kontrolę wszystkich stałych w określonej grupie itp. Na przykład rozważ wartości READYSTATE wyliczenia dla właściwości IE o wartości ReadyState. Zamiast tworzyć oddzielną zmienną lub oddzielną funkcję stałą dla każdej wartości, można im grupy w 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__ 

A zatem, można intuicyjnie używać ich jako w:

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 także Neil Bowers' excellent review on 'CPAN modules for defining constants'.

+0

Ah cool! Przepraszam. – ikegami