2015-08-06 3 views
7

Я ищу наиболее эффективный и удобный способ экспортировать все константы из моего отдельного модуля, который используется только для хранения констант.
НапримерЧто представляет собой наиболее эффективный способ экспорта всех констант (переменные Readonly) из модуля Perl

use strict; 
use warnings; 

use Readonly; 

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

Так что есть много переменных, и перечислить их все в наших @EXPORT = qw(MY_CONSTANT1....);
Это будет болезненным. Есть ли элегантный способ экспортировать все константы, в моем случае переменные Readonly (принудительно экспортируйте все, не используя @EXPORT_OK).

ответ

4

Действительные константы:

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

переменные доступны только для чтения с 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

Добавлена ​​версия Readonly. – ikegami

+0

Исправлена ​​опечатка, отключена ложным предупреждением и немного оптимизирована. – ikegami

+0

Спасибо за ответ, можете ли вы привести пример использования констант в обоих случаях? – CROSP

5

Если эти константы, которые, возможно, должны быть интерполированы в строки и т.д., рассмотрим группировку связанных констант в хэш и создание постоянной хеша с использованием Const::Fast. Это уменьшает загрязнение пространства имен, позволяет вам проверять все константы в определенной группе и т. Д. Например, рассмотрите значения перечисления READYSTATE для свойства IE ReadyState. Вместо того чтобы создавать отдельную переменную или отдельную постоянную функцию для каждого значения, вы можете сгруппировать их в хэш:

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__ 

А, значит, вы можете интуитивно использовать их как в:

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

См тоже Neil Bowers' excellent review on 'CPAN modules for defining constants'.

+0

Ах круто! Сожалею. – ikegami