Подтвердить что ты не робот

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

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

4b9b3361

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