#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
поэтому вы несете расходы на вызов метода (что, вероятно, не имеет значения).