Как определить константы в отдельном файле в 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;
Это просто очень простое представление о том, что вы можете сделать с пакетом/модулем, но для чего вам это может быть самым простым способом его реализации. Точно так же вы можете поместить в пакет также и ссылку на них аналогичным образом.