“使用”和“要求”之间有两个区别。其中一个会影响您当前的问题,另一个不会。不幸的是,您正在解决一个没有效果的问题。
区别在于:
1/ 'use' 调用 import() 函数,'require' 没有。
2/ 'use' 发生在编译时,'require' 发生在运行时。
您正在解决“require”不会通过显式调用来调用 import() 的事实。这没有任何效果,因为您的模块不导出任何符号并且没有 import() 子例程。
您没有解决“使用”语句在运行时执行的事实。问题是“使用常量 SERVICE_URL => APIconfig::SERVICE_URL();” 在编译时执行并且你的'require'还没有运行,所以myPackage对APIconfig一无所知。
(讨厌的,hacky)解决方案是将“require”语句放入 BEGIN 块中 - 强制它在编译时执行。您还需要删除对 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 重写为真正的模块。你暗示你知道这一点,但环境问题阻止你采取这种方法。我强烈建议尝试解决这些问题并正确地做事。