だから...共通コードを別のモジュールに分解するという提案は良いものです。ただし、モジュールに *.pl という名前を付けたりrequire
、特定のパス名を -ing してモジュールをロードしたりしないでください (のようにrequire
"../lib/foo.pl";
)。(たとえば、「..」と言うと、スクリプトは毎回同じ作業ディレクトリから実行されることに依存します。そのため、スクリプトを として実行すると機能する可能性がありますが、 として実行するとperl foo.pl
機能しませんperl YourApp/foo.pl
。つまり、一般的には良くありません。)
あなたのアプリが YourApp と呼ばれているとしましょう。ディレクトリに存在するモジュールのセットとしてアプリケーションを構築する必要がありますlib/
。たとえば、これは「Foo」モジュールです。そのファイル名はlib/YourApp/Foo.pm
.
package YourApp::Foo;
use strict;
sub do_something {
# code goes here
}
ここで、「Foo」に依存する「Bar」というモジュールがあるとします。あなたはただ作っlib/YourApp/Bar.pm
て言う:
package YourApp::Bar;
use strict;
use YourApp::Foo;
sub do_something_else {
return YourApp::Foo::do_something() + 1;
}
(高度な演習として、Sub::Exporter
またはExporter
を使用して、使用use YourApp::Foo
するパッケージの名前空間にサブルーチンをインストールすることができます。これにより、YourApp::Foo::
すべての前に記述する必要がなくなります。)
とにかく、このようにアプリ全体を構築します。機能の論理的な部分は、モジュール (またはクラス) にまとめてグループ化する必要があります。
このすべてを実行するには、次のような小さなスクリプトを作成します (これらを に入れてbin/
いるので、 と呼びましょうbin/yourapp.pl
)。
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':5.10';
use FindBin qw($Bin);
use lib "$Bin/../lib";
use YourApp;
YourApp::run(@ARGV);
ここで重要なのは、アプリの実行を開始するための小さなボイラープレートを除いて、コードがモジュールの外側にないことです。これは保守が簡単で、さらに重要なことに、自動化されたテストを簡単に作成できます。コマンドラインから何かを実行する代わりに、いくつかの値を指定して関数を呼び出すことができます。
とにかく、これはおそらく今話題から外れています。でも、知ることは大事だと思います。