Как использовать константы из модуля Perl? - PullRequest
38 голосов
/ 11 октября 2008

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

Ответы [ 6 ]

46 голосов
/ 11 октября 2008

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

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 (см. Документацию Exporter) для определения групп констант, которые можно экспортировать с помощью одного аргумента импорта.

Обновление: вот пример того, как использовать функцию %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;
24 голосов
/ 11 октября 2008

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

# 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;
21 голосов
/ 11 октября 2008

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

use Foo;
print Foo::BAR;
17 голосов
/ 11 октября 2008

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

8 голосов
/ 13 октября 2008
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 голосов
/ 18 октября 2008

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

package Foo;
use constant PI => 3.14;

print Foo->PI;

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

...