Проблема, с которой вы сталкиваетесь, - это взаимодействие между временем выполнения и временем компиляции в вашем скрипте. Любое объявление use
имеет неявный блок BEGIN {...}
, что означает, что оно происходит во время компиляции. Ваше присвоение %setup
происходит во время выполнения, после того, как константа была объявлена. Исправление для этого состоит в том, чтобы объявить переменную, а затем выполнить присвоение ей в блоке BEGIN
. Таким образом, переменная будет определена временем use constant ...
:
use my_common_declarations 'debugme';
my (%setup, $DEBUGME); # declare variables with file scope
BEGIN {
%setup = debugme; # assign to variables at compile time
$DEBUGME = $setup{setup}{debugme};
}
use constant true => $setup{setup}{true}; # %setup is defined now
В качестве альтернативы, поскольку вы экспортируете функцию, которая возвращает хеш, почему бы ей не вернуть ссылку на хеш, тогда вы можете написать свой код как:
use my_common_declarations 'debugme';
use constant true => debugme->{setup}{true};
В этом случае, поскольку debugme
импортируется первым оператором use
во время компиляции, он доступен в строке use constant ...
.
Но поскольку вы объявляете пакет для общих объявлений, почему бы просто не переместить определение ваших констант в этот пакет, а затем добавить такие вещи, как true
, в список экспорта для этого пакета?