Если я определяю константу в модуле Perl, как мне использовать эту константу в моей основной программе? (Или как я могу назвать эту константу в основной программе?)
Как использовать константы из модуля Perl?
Ответ 1
Константы могут экспортироваться точно так же, как и другие символы пакета. Используя стандартный Exporter модуль, вы можете экспортировать константы из пакета следующим образом:
package Foo;
use strict;
use warnings;
use base 'Exporter';
use constant CONST => 42;
our @EXPORT_OK = ('CONST');
1;
Затем в клиентском script (или другом модуле)
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;
Ответ 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;
Ответ 4
Возможно, вы захотите использовать Readonly вместо константы.
Ответ 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
, поэтому вы берете на себя стоимость вызова метода (что, вероятно, не имеет значения).