Использование отдельных блоков "use констант"
Обойти эту проблему, но это
добавляет много ненужного кода.
Это правда?
use constant BASE_PATH => "/etc/app1";
use constant {
LOG4PERL_CONF_FILE => BASE_PATH . "/log4perl.conf",
CONF_FILE1 => BASE_PATH . "/config1.xml",
CONF_FILE2 => BASE_PATH . "/config2.xml",
CONF_FILE3 => BASE_PATH . "/config3.xml",
CONF_FILE4 => BASE_PATH . "/config4.xml",
CONF_FILE5 => BASE_PATH . "/config5.xml",
};
Я не вижу много проблем с этим. Вы указали базовый путь только в одной точке, тем самым соблюдая принцип СУХОЙ. Если вы назначите BASE_PATH с переменной среды:
use constant BASE_PATH => $ENV{MY_BASE_PATH} || "/etc/app1";
... тогда у вас есть дешевый способ перенастроить вашу константу без необходимости редактировать код. Что тут не нравится в этом?
Если вы действительно хотите сократить повторяющуюся конкатенацию "BASE_PATH.", Вы можете добавить немного оборудования для самостоятельной установки констант и убрать это из расчета:
use strict;
use warnings;
use constant BASE_PATH => $ENV{MY_PATH} || '/etc/apps';
BEGIN {
my %conf = (
FILE1 => "/config1.xml",
FILE2 => "/config2.xml",
);
for my $constant (keys %conf) {
no strict 'refs';
*{__PACKAGE__ . "::CONF_$constant"}
= sub () {BASE_PATH . "$conf{$constant}"};
}
}
print "Config is ", CONF_FILE1, ".\n";
Но в этот момент я думаю, что баланс переместился с Правильного на Настя :) Для начала, вы больше не можете использовать grep для CONF_FILE1 и посмотреть, где он определен.