4

perl と apache を使用して、内部自動化/Web ツールを構築しています。Windows環境でホストされています。私の質問は、すべてが共通のモジュールを持つ多くのページを扱う場合です。各ページに各モジュールを手動で追加する代わりに、ページで使用できるすべてのモジュールを「グローバル モジュール」にプルさせることは可能ですか?

たとえば、新しいモジュールを追加する必要があり、10 ページある場合、各ページに移動して追加する代わりに New::Package; を使用します。この構成モジュールを使用する各ファイルで New::Package を使用できるようにする 1 つの構成ファイルでこれを行うことは可能ですか?

私はこれを PHP で行いました。ここでは、いくつかの init スクリプトに include/require し、その init スクリプトを各ページに含めるだけです。

Package MyProj::Configuration
use package1;
...
use package999;

# Main Page
use MyProj::Configuration;

# Now all modules are included in this page, without needing to add them manually

TLDR: この魔法の構成モジュールのみを含むページに複数のモジュール/パッケージを構成モジュールにインポートさせることはできますか?

編集:私はperlにかなり慣れていないことを付け加えたいので、これが明らかなことである場合は、簡単に行ってください:)

4

1 に答える 1

4

これはまったく明白なことではありません。このExporterモジュールは、export_to_levelこの問題に役立つ機能を提供します。通常、 を使用するExporter(つまり、パッケージを のサブクラスにするExporter) と、呼び出し元のパッケージにシンボルがエクスポートされます。このexport_to_levelメソッドを使用すると、スタック トレースの上位にあるパッケージにシンボルをエクスポートできます。これは、ここで実行したいことです。概念実証は次のとおりです。

エクスポートされた関数を持つ最初のいくつかのモジュール:

# Module1.pm
package Module1;
use base 'Exporter';
our @EXPORT = ('foo');
sub foo { "FOO" }
1;

# Module2.pm
package Module2;
use base 'Exporter';
our @EXPORT_OK = ('bar');
sub bar { "BAR" }
1;

# Module3.pm
package Module3;
use base 'Exporter';
our @EXPORT_OK = ('baz');
our %EXPORT_TAGS = ('all' => [ 'baz' ]);
sub baz { "BAZ" }
1;

と、言うよりも

use Module1;
use Module2 'bar';
use Module3 ':all';
use Module4;         # some other module that doesn't need to export anything

何十ものスクリプトのすべてで、

use Module1234;

したがって、次のModule1234.pmようになります。

package Module1234; # optional
use Module1;
use Module2;
use Module3;
use Module4;

# these commands could go inside an  import  method, too.
Module1->export_to_level(1, __PACKAGE__);
Module2->export_to_level(1, __PACKAGE__, 'bar');
Module3->export_to_level(1, __PACKAGE__, ':all');
1;

通話中

package MyPackage;
use Module1234;

MyPackageスクリプトで、他の 4 つのモジュールをロードし、必要なすべての関数をパッケージにエクスポートします。

use Module1234;
print foo(), bar(), baz();

出力を生成するには十分"FOOBARBAZ"です。

于 2013-08-12T19:01:27.287 に答える