Как определить константы в отдельном файле в Perl?

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

Ответы

Ответ 1

В Perl нет эквивалента файлам заголовков C. Чтобы объявить и определить глобальные константы, вы можете использовать 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 docs).

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

Ответ 2

Обычно мы делаем это с именем модуля 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 и ввести все нужные символы.

Ответ 3

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

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

Ответ 4

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

package myFabulousPackage;

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

1;

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

#!/usr/bin/perl

use myFabulousPackage;

print $myFabulousPackage::otherSetting;

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