「使用」と「必要」には 2 つの違いがあります。そのうちの 1 つは現在の問題に影響しますが、もう 1 つは影響しません。残念ながら、効果のないものを回避しています。
違いは次のとおりです。
1/ 'use' は import() 関数を呼び出しますが、'require' は呼び出しません。
2/ 'use' はコンパイル時に発生し、'require' は実行時に発生します。
「require」が明示的に呼び出して import() を呼び出さないという事実を回避しています。モジュールはシンボルをエクスポートせず、import() サブルーチンを持たないため、これは効果がありません。
「use」ステートメントが実行時に実行されるという事実を回避していません。問題は、「定数 SERVICE_URL => APIconfig::SERVICE_URL(); を使用する」ことです。コンパイル時に実行され、それまでに「require」が実行されていないため、myPackage は APIconfig について何も知りません。
(厄介でハックな)解決策は、「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 を実際のモジュールとして書き直すことです。あなたはそれを知っていることをほのめかしますが、環境問題があなたがこのアプローチをとることを妨げていることをほのめかします。これらの問題を回避し、正しく行うことを強くお勧めします。