10

12個のディレクトリに100個のPerlモジュールがあると考えてください。しかし、メインのPerlスクリプトを見ると、100use p1 ; use p2 ;などのように見えます。この問題を解決するための最良の方法は何ですか?

4

4 に答える 4

8

use100個のモジュールすべてをメインプログラムで直接使用しているとは思えません。プログラムがモジュールAの関数を使用し、モジュールBの関数を呼び出すが、メインプログラム自体がモジュールBの関数を参照していない場合、プログラムは。のみを参照する必要がありuse Aます。use BモジュールBから直接何かを呼び出さない限り、そうすべきではありません。

一方、メインプログラムが実際に100個のモジュールすべてと直接通信する場合は、おそらく大きすぎます。プログラム内のさまざまな機能グループを特定し、それらの各グループを独自のモジュールに分割します。これを行う主な理由は、コードの保守性、柔軟性、再利用性を高めるためですが、メインプログラムが直接通信するモジュールの数を減らして、削減するという嬉しい副作用もあります。use1か所で必要なステートメントの数を減らします。

(そして、はい、私は100がおそらく誇張であったことを認識していますがuse、コードによってdされているモジュールの数に不快感を覚えている場合、それは通常、問題のコードが実行しようとしていることを強く示しています多くは1つの場所にあり、モジュールのコレクションに分割する必要があります。)

于 2010-05-07T14:29:51.903 に答える
4

useMods.pmのように、すべてのステートメントを1つのファイルに入れます。

package Mods;

use Mod1;
use Mod2;
...

そして、メインスクリプトにファイルを含めます。

use Mods;
于 2010-05-07T13:04:03.780 に答える
2

私はeugeneのソリューションをサポートしていますが、次のuseように、トピックごとにファイル内のステートメントをグループ化できます。

package Math;

use ModMatrix;
use ModFourier;
...

そしてもちろん、モジュールとmod-collectionsに意味のある名前を付ける必要があります。

于 2010-05-07T13:15:16.360 に答える
1

eugene yが提案したように、すべてのuseステートメントを別のファイルに入れるのがおそらく最良のアプローチです。少しのメタプログラミングで、そのモジュールへの入力を最小限に抑えることができます。

package Mods;
require Exporter;
our @ISA = 'Exporter';

my @packages = qw/Mod1 Mod2 Mod3 .... /;  
     # or  map {"Mod$_"} 1 .. 100  if your modules are actually named that way

for (@packages) {
    eval "require $_" or die $@;  # 'use' means "require pkg; pkg->import()" 
    $_->import();                 # at compile time
}

our @EXPORT = grep {*{$Mods::{$_}}{CODE}} keys %Mods::; # grab imported subs
#or @EXPORT_OK
于 2010-05-07T14:53:58.880 に答える