2015-08-06 15 views
7

Tüm sabitleri ayrı modülümden vermenin en etkili ve okunabilir yolunu arıyorum, yalnızca sabitleri depolamak için kullanılır. Tüm sabitleri dışa aktarmanın en etkili yolu nedir (Readonly değişkenler) Perl modülünden

use strict; 
use warnings; 

use Readonly; 

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

Mesela

için
Yani değişkenler çok şey var ve bizim @EXPORT = qw(MY_CONSTANT1....);
Olacak acı içindeki hepsini listelemek için. Benim durumumda tüm sabitleri dışa aktarmanın herhangi bir yolu var mı? Benim durumumdaki değişkenler (@EXPORT_OK kullanmadan tüm dışa aktarma).

cevap

4

Gerçek sabitler:

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

Değişkenler salt okunur yapılan Readonly ile:

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

Readonly sürümü eklendi. – ikegami

+0

Bir yazım hatası düzeltildi, sahte bir uyarıyı susturdu ve biraz iyileştirildi. – ikegami

+0

Yanıtladığınız için, her iki durumda da sabitlerin kullanımına dair bir örnek verebilir misiniz? – CROSP

5

bunlar bir içine ilgili sabitleri gruplandırma düşünün, vb dizeleri yansıtılmadan gerekecektir gerekebilir sabitler ise hash ve Const::Fast kullanarak karma sabitini yapma. Bu, ad alanı kirliliğini azaltır, belirli bir gruptaki tüm sabitleri incelemenizi sağlar. Örneğin, IE'nin ReadyState özelliği için READYSTATE numaralandırma değerlerini dikkate alın. Bunun yerine bir karma her değer için, yapabilirsin grup onları ayrı bir değişken veya ayrı sabit fonksiyon oluşturma: o zaman

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__ 

Ve, sezgisel olarak kullanabilirsiniz:

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"; 
} 

bakın ayrıca Neil Bowers' excellent review on 'CPAN modules for defining constants'.

+0

Ah güzel! Afedersiniz. – ikegami