Copyrigt (C) 2001 UENO Kojun. All rights reserved.

PerlでCGIアプリケーションを作成するときの基本推奨ルール

上野貢潤
リンクフリー
無保証

推奨事項A-1:コンポーネント配置

アクセスコントロールの観点から、3つのファイルパスを区別して下さい。

公開パス

例: /path1/cgi-bin/your_project.cgi
CGI起動スクリプトが置かれるパスです。 このパスがhttp://host/cgi-bin/your_project.cgi のようにURLとして公開されます。
CGIに特有かつ必然のものです。 おそらく実行パーミッションが必要です。

プログラムパス

例: /path2/your_project/inc/
ここを.pmなどのプログラム・ファイルがサーチされるパスとして@INCに追加します。 リードオンリーとなります。

作業パス

例: /path3/your_project/data/
ここを実行時のカレントディレクトリとし、データファイル、ログファイル、作業ファイル等を書き出させます。 書き込みパーミッションを与えます。

URLでプログラムやデータを指すことがないよう、公開パスとそれ以外を分ける必要があります。
UNIXシェル環境ではプログラムは/binなどのパスに置かれます。 Windows環境ではC:\Program Filesなどに置かれます。 同様にJava実行環境ではクラスパスというものがあります。 それらに相当するのが上記プログラムパスで、作業パスとは区別されます。

推奨事項A-2:パッケージ

ある程度以上の複雑さのものをしっかり作るとなれば、 アプリケーションは複数モジュールから構成されることになります。 オブジェクト指向設計に慣れていなければ、必ずしも.pmをクラスにする必要はありません。サブルーチン集程度でよいので.pm形式でモジュールを作成して下さい。 それぞれのモジュールには、サブルーチンや変数の衝突を避けるために、パッケージ名を付けてください。 パッケージ名に組織名、プロジェクト名を使用することを薦めます。
例: package _YourCorp::YourProj::YourModule;
パッケージ名のトップレベルにアンダーバーを含ませるとCPANに登録されているライブラリとの衝突が防がれます。
/path2/your_project/inc/_YourCorp/YourProj/YourModule.pm
--------------------------------------------------
package _YourCorp::YourProj::YourModule;

sub get_footer {
   return qq(**** All rights reserved. YourCorp. ****\n);
}

1;
--------------------------------------------------

推奨事項A-3:メインルーチン

C言語やJava言語では、mainというルーチン名があります。 すなわちメインルーチンもサブルーチンの一種となっています。 しかし、Perlではメインルーチンのみがスクリプトファイル全体で表現されるようになっています。 ファイルという単位はモジュールという単位に結びついていますので、メインルーチンもsubとして定義するようにします。 そうしないと、起動時にメインルーチン・スクリプトのパスとモジュールのパスを別々に指定しなくてはならなくなります。 メインルーチンのみ.pl形式にする必要もありませんので、.pmに統一して下さい。
/path2/your_project/inc/_YourCorp/YourProj/CGI.pm
--------------------------------------------------
package _YourCorp::YourProj::CGI;
use base qw(Exporter); @EXPORT = qw(cgi);
use _YourCorp::YourProj::YourModule;
use CGI;

# CGI用メインルーチン
sub cgi {
   print "Content-type:text/plain\n";
   print "\n";
   print "Hello, world!\n";
   print _YourCorp::YourProj::YourModule->get_footer();
}

1;
--------------------------------------------------
Exporterを利用して、メインルーチンを@EXPORTでEXPORTします。 メインルーチン以外をEXPORTしたい場合は@EXPORTではなく@EXPORT_OK, %EXPORT_TAG を使用して下さい。 このメインルーチンを呼び出すための CGI起動スクリプトは以下のようになります。
/path1/cgi-bin/your_project.cgi
--------------------------------------------------
#! command_shell
cd /path3/your_proj/data/
perl -I/path2/your_proj/inc -M_YourCorp::YourProj::CGI -e cgi -- arg1 arg2
--------------------------------------------------
または
/path1/cgi-bin/your_project.cgi
--------------------------------------------------
#! perl
BEGIN {chdir '/path3/your_proj/data/';}
use lib qw(/path2/your_proj/inc);
@ARGV = qw(arg1 arg2);
use _YourCorp::YourProj::CGI;
&cgi;
exit;
--------------------------------------------------

Copyrigt (C) 2001 UENO Kojun. All rights reserved.