Как использовать константы из модуля Perl?

#perl #module #export #constants

Вопрос:

Если я определяю константу в модуле Perl, как я могу использовать эту константу в своей основной программе? (Или как мне назвать эту константу в основной программе?)

Комментарии:

1. Лучше всего избегать «постоянного» пакета. earino.wordpress.com/2013/02/27/… Альтернативы здесь: neilb.org/reviews/constants.html

2. @null Только потому, что один парень ненавидит, когда они сталкиваются с поведением без слов Perl в инициализаторах хэша? Спасибо, но нет, спасибо. Тонны основных модулей используют его без проблем. Кодирование, сжатие::Raw::Bzip2/Zlib, Данные::Дампер, Файл::Спецификация и т. Д.

Ответ №1:

Константы могут быть экспортированы так же, как и другие символы пакета. Используя стандартный модуль экспорта, вы можете экспортировать константы из такого пакета:

 package Foo;
use strict;
use warnings;

use base 'Exporter';

use constant CONST => 42;

our @EXPORT_OK = ('CONST');

1;
 

Затем в клиентском скрипте (или другом модуле)

 use Foo 'CONST';
print CONST;
 

Вы можете использовать %EXPORT_TAGS хэш (см. Документацию экспортера) для определения групп констант, которые можно экспортировать с помощью одного аргумента импорта.

Обновление: Вот пример того, как использовать эту %EXPORT_TAGS функцию, если у вас несколько констант.

 use constant LARRY => 42;
use constant CURLY => 43;
use constant MOE   => 44;

our @EXPORT_OK = ('LARRY', 'CURLY', 'MOE');
our %EXPORT_TAGS = ( stooges => [ 'LARRY', 'CURLY', 'MOE' ] );
 

Тогда вы можете сказать

 use Foo ':stooges';
print "$_n" for LARRY, CURLY, MOE;
 

Комментарии:

1. используйте экспортер «импорт»; лучше, но потребуется обновить экспортер на perl раньше, чем 5.8.3.

2. пожалуйста, объясните, почему лучше использовать «импорт»?

3. Лучше всего избегать «постоянного» пакета. earino.wordpress.com/2013/02/27/… Альтернативы здесь: neilb.org/reviews/constants.html

4. @ use constant nslntmnx в целом неплохо справляется с тестами. Это правда, что для этого нужно прочитать документацию.

Ответ №2:

Константы-это просто вспомогательные элементы с пустым прототипом, поэтому их можно экспортировать, как и любые другие вспомогательные элементы.

 # file Foo.pm
package Foo;
use constant BAR => 123;
use Exporter qw(import);
our @EXPORT_OK = qw(BAR);


# file main.pl:
use Foo qw(BAR);
print BAR;
 

Ответ №3:

Чтобы расширить более ранние ответы, поскольку константы на самом деле являются просто вспомогательными, вы также можете вызвать их напрямую:

 use Foo;
print Foo::BAR;
 

Комментарии:

1. Не относитесь к ответам как к вышеперечисленным, потому что, если ваш ответ будет достаточно одобрен, он может оказаться выше их.

Ответ №4:

Возможно, вы захотите рассмотреть возможность использования только для чтения вместо константы.

Комментарии:

1. Вы не можете сделать это с ним: напечатать «константа-это $константа»; или это: напечатать $хэш{константа};

2. Поскольку «использовать константу» создает подпрограмму, возникают неожиданные проблемы => нет интерполяции строк, трудности с использованием в качестве хэш-ключа. Смотрите документы только для чтения [ metacpan.org/module/Readonly#COMPARISON-WITH-use-constant ] . Только для чтения используйте внутренние компоненты perl, чтобы напрямую пометить переменную как доступную только для чтения. Только для чтения выполняется медленно (если только не используется только для чтения::XS) и не поддерживается. См.также Data::Lock и Const::Fast для разных реализаций.

3. На самом деле вы можете интерполировать константу в строку. Просто используйте тот же синтаксис, который вы использовали бы с любой другой функцией: use constant COLOR => 'red'; print "The color is @{[COLOR]}!";

Ответ №5:

 package Foo;
use Readonly;
Readonly my  $C1 => 'const1';
Readonly our $C2 => 'const2';
sub get_c1 { return $C1 }
1;

perl -MFoo -e 'print "$_n" for Foo->get_c1, $Foo::C2'
 

Ответ №6:

Чтобы добавить к сумке трюков, поскольку константа-это всего лишь подпрограмма, вы даже можете назвать ее методом класса.

 package Foo;
use constant PI => 3.14;

print Foo->PI;
 

Если у вас много констант, это хороший способ получить случайную, не экспортируя их все. Однако, в отличие Foo::PI от экспорта или экспорта PI , Perl не будет компилироваться, Foo->PI поэтому вы несете расходы на вызов метода (что, вероятно, не имеет значения).