Как я могу определить константы в отдельном файле в Perl? - PullRequest
14 голосов
/ 20 сентября 2009

У меня есть куча файлов Perl, которые принимают некоторые константы имени файла. Я хотел бы определить их в отдельном файле - что-то вроде заголовочного файла в C. Какой лучший / самый стандартный способ сделать это в Perl?

Ответы [ 4 ]

16 голосов
/ 20 сентября 2009

Нет эквивалента заголовочным файлам C в Perl. Чтобы объявить и определить глобальные константы, вы можете использовать прагму define . У меня нет опыта работы с этим модулем, хотя интерфейс кажется разумным.

С другой стороны, вы можете написать модуль, в котором вы определяете константы, и импортировать их в свой модуль, используя use. Например:

package MyConstants;

use strict; use warnings;

use Exporter qw( import );
use Const::Fast;

our @EXPORT = qw();
our @EXPORT_OK = qw( $X $Y );

const our $X => 'this is X';
const our $Y => 'this is Y';

__PACKAGE__;
__END__

Затем вы можете использовать этот модуль следующим образом:

#!/usr/bin/perl

use strict; use warnings;

use MyConstants qw( $X );

print "$X\n";
print "$MyConstants::Y\n";

Если вы в порядке с использованием полных имен переменных (например, $MyConstants::Y), вам вообще не нужен Exporter.

Кроме того, убедитесь, что экспортируемые переменные не могут быть изменены в других местах (см. Предупреждение в Exporter документах).

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

7 голосов
/ 20 сентября 2009

Обычно мы делаем это с именем модуля Constants. Что-то вроде:

package MyPackage::Constants;

our $DIR = "/home/chriss";
our $MAX_FILES = 5;

1;

Затем, чтобы использовать его:

package MyPackage;
use MyPackage::Constants;

open(my $fh, ">", $MyPackage::Constants::DIR . "/file");

Если вы не хотите постоянно ссылаться на пакет, вы можете использовать Exporter и ввести все необходимые символы.

5 голосов
/ 20 сентября 2009

Это похоже на параметры конфигурации, которые лучше поместить в файл конфигурации, который вы анализируете с помощью одного из различных модулей CPAN, например, Config :: Any .

Конфигурация - это данные, которых IMO не должно быть в вашем коде.

0 голосов
/ 20 сентября 2009

Один из способов - записать их в виде модуля perl, который впоследствии можно включить с помощью «require» или «use». Вы бы написали свой файл следующим образом - дайте ему расширение .pm (например, myFabulousPackage.pm)

package myFabulousPackage;

$someSetting=45;
$otherSetting='Fish';

1;

Затем в вашем скрипте perl это будет включать файл, а затем ссылку на $ otherSetting:

#!/usr/bin/perl

use myFabulousPackage;

print $myFabulousPackage::otherSetting;

Это просто очень простое представление о том, что вы можете сделать с пакетом / модулем, но для того, что вам нужно, это может быть самый простой способ реализовать его. Точно так же вы можете поместить sub в пакет и ссылаться на них аналогичным образом.

...