Существует два различия между «использовать» и «требовать».Один из них влияет на вашу текущую проблему, другой нет.К сожалению, вы работаете над тем, что не имеет никакого эффекта.
Различия:
1 / 'use' вызывает функцию import (), 'require' - нет.
2 / 'use' происходит во время компиляции, 'require' происходит во время выполнения.
Вы работаете вокруг того факта, что 'require' не вызывает import (), вызывая его явно.Это не имеет никакого эффекта, так как ваш модуль не экспортирует никаких символов и не имеет подпрограммы import ().
Вы не работаете вокруг того факта, что операторы 'use' выполняются во время выполнения.Проблема в том, что "использовать константу SERVICE_URL => APIconfig :: SERVICE_URL ();"выполняется во время компиляции, и ваш 'require' к тому времени еще не выполнялся, поэтому myPackage ничего не знает о APIconfig.
(неприятное, хакерское) решение - поместить оператор require в блок BEGIN - toзаставить его выполняться во время компиляции.Вы также захотите удалить вызов функции import (), поскольку это приводит к ошибке времени выполнения (из-за отсутствия подпрограммы).
Тестовые файлы, которые я использовал для решения этой проблемы, следующие:
$ cat APIconfig.pl
package APIconfig;
use constant SERVICE_URL => 'http://api.example.org/blah';
1;
$ cat api.pl
#!/usr/bin/perl
package myPackage;
BEGIN {
require "APIconfig.pl";
}
# APIconfig::import(APIconfig);
use constant SERVICE_URL => APIconfig::SERVICE_URL();
print SERVICE_URL, "\n";
$ ./api.pl
http://api.example.org/blah
Реальное решение - переписать APIconfig как реальный модуль.Вы намекаете, что знаете это, но экологические проблемы мешают вам использовать этот подход.Я настоятельно рекомендую попытаться обойти эти проблемы и делать все правильно.