Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

便利な関数をライブラリにする研究

研究内容

フォームデータ取得関数 getformdata関数をライブラリにします。 ライブラリの作り方、ライブラリの使い方を研究します。

詳細

なんで関数にしたのか復習

関数を作ったのは、その方が分かりやすく、便利だからでした。 getformdataという関数名だけで、それがフォームのデータを取得する機能を 持っているんだなって分かっちゃいますし、 データを取得するのに「$formdata = getformdata();」 ってするだけなので、関数にするとなんだかすっきりして プログラムが分かりやすくなりますよね。

関数を沢山のCGIプログラムで使う方法その1

ある関数が、沢山のCGIプログラムから利用されるくらい便利なものだったら、どうでしょう。 先に作ったgetformdata関数も、フォームからデータを受け取る全てのCGIプログラムで 使えそうですよね。 そういう時、「たしかあそこにgetformdata関数があったなぁ」って getformdata関数を使っているファイルを思い出して、その中から getformdata関数をコピぺする。そんなやり方でも、沢山のCGIプログラムで getformdata関数を利用することができます。でも、これは面倒であんまり便利じゃないし、 困ったことも起こります。 困ったことというのは、getformdata関数になにか不具合(バグっていいます)があった場合。 たとえば、日本語を受け取った時に、%〜っていう風になったままになってるとか。 (実際、そうなんですよね (^^;) だって、getformdata関数はあちこちのCGIプログラムにコピペされちゃってますから、 修正したgetformdata関数を、あちこちにコピペし直さなきゃいけません。 これは大変ですよ!

関数を沢山のCGIプログラムで使う方法その2

コピペなんてする必要はありません。ライブラリにしましょう!

ライブラリとは

ライブラリというのは、関数を集めたもの、です。 今回は1つの関数だけのライブラリを作りますが、 1つだけでも立派なライブラリです。 ある関数が、1つのCGIプログラムのためだけのものだったらライブラリにする 必要はありませんが、getformdata関数みたいに便利な関数をライブラリしておけば、 沢山のCGIプログラムで、簡単にgetformdata関数を利用することができるようになるんです。 これは便利だし、なにより楽です!

結果

ライブラリの拡張子

CGIプログラムの拡張子はcgiでしたね。 ライブラリの拡張子は、plにすることが多いみたいです。 もともと、Perlのファイルは拡張子をplにするっていうのが普通だったようなんですが、 CGIプログラムの場合は拡張子はcgiだっていうことで、拡張子をcgiにしてました。 plっていう拡張子は使ってなかったんです。 そこで、ライブラリにplっていう拡張子を使うようにしよう! と誰かが思ったんだと思います。そうして、ライブラリの拡張子はpl、 というのが通例になったと。管理人も、もちろんそうします。 plって、Perl Library の略にもなってますし (^^

ライブラリのファイル名

拡張子はplですが、ファイル名の拡張子を除いた部分は自由に決めていいです。 今回は、getformdata関数1個だけのライブラリなので、 ファイル名は getformdata.pl としました。

ライブラリファイルを作ります

getformdata.pl という新しいファイルを作って、そこにgetformdata関数をコピペ。 そして、ファイルの最後に 1; を付けます。

sub getformdata
{
	local $formdata;
	if ($ENV{'REQUEST_METHOD'} eq "GET") {
		$formdata = $ENV{'QUERY_STRING'};
	}
	else {
		read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'});
	}
	return $formdata;
}

1;

cgiファイルとの違いが、2つありますね。 1つは、1行目のアレが無いこと。それは、このファイルは直接実行されないからです。 もう1つは、ファイルの最後の 1; 。これは、ライブラリファイルが読み込まれた時に、 OKですよ!ということを示すものみたいです。まぁ、OKじゃないですよ!というシーンに まだ出会ってないので、今のところ、おまじないみたいなものですね。

ライブラリの使い方

ライブラリをCGIプログラムの中で利用するには、次のようにして ライブラリファイルを読みこみます。

require 'getformdata.pl';

こうすると、getformdata.pl が読み込まれるんです。 読み込まれると、getformdata.pl の中にある getformdata関数が使えるようになります。

ちなみに require っていうのは、他のファイルをこの位置に読み込め!っていう命令です。 ライブラリファイルを読み込むのに限ったものではなくて、なんでも読み込めるみたいです。 いろいろ応用があるみたいなんですが、それもいつか研究しましょう。

ライブラリファイルのパーミッション

ライブラリファイルは、直接実行されるものではありません。 CGIプログラムによって読み込まれるんですね。 なので、ライブラリファイルには実行権は必要ありません。 その代わり、読み込み許可は必要です。 といっても、読み込み許可は最初から付いているのが普通なので、 cgiファイルのようにFTPしたあとにパーミッションを変更する必要は無いです。

作成したCGIプログラム

getformdatatest.cgi
#!/usr/bin/perl

require 'getformdata.pl';

print "Content-type: text/html\n";
print "\n";

$formdata = getformdata();
print "formdata : $formdata";
getformdata.pl
sub getformdata
{
	local $formdata;
	if ($ENV{'REQUEST_METHOD'} eq "GET") {
		$formdata = $ENV{'QUERY_STRING'};
	}
	else {
		read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'});
	}
	return $formdata;
}

1;

実行結果

下の入力ボックスに文字列を入力して、送信ボタンを押してください。 別窓が開きます。

考察

CGIプログラム本体がすっきり!

ライブラリを作るっていうのは、結構簡単でした。ファイルの最後に 1; を付けるのさえ 忘れなければ他に面倒なことはありません。FTPするときにテキストモードにするのを 忘れないようにすればいいだけですね。こんなに簡単に作れるライブラリですが、 ライブラリにすることで、CGIプログラムがなんとすっきりすることか! なんか、フォームからデータを受信するのに費やした苦労がすっぽり抜けてしまったかの ようなシンプルさ。素晴らしいじゃないですか (^^;

再利用性もバッチリ!

ライブラリにしましたから、getformdata関数を使いたいときは require 'getformdata.pl';って するだけでOKです。便利ですね〜!

これからもライブラリ化を意識して

まだCGIプログラムを作り始めたばかりなのでライブラリの便利さっていうのは 実感できませんが、これから何度も使うことになるだろう getformdata関数をこれだけ 簡単に呼び出せるっていうのはなんだか嬉しくなります。 getformdata関数以外にも、いろんなCGIプログラムで利用できるくらい便利なものが作れたら、 どんどんライブラリにして再利用するようにしましょう! CGIプログラムを作るときには、「これは関数にすべきかな?ライブラリにすべきかな?」って 考えながら作るようにすると良さそうですね。

分かったこと

  1. 沢山のCGIプログラムから利用したいような便利な関数はライブラリにしましょう。
  2. ライブラリファイルの拡張子はplが一般的です。
  3. ライブラリファイルには実行権限が無くてもいいです。読み込み権限は必要です。
  4. ライブラリファイルは最後で 1; としなければいけません。
  5. ライブラリを読み込むには require 'ファイル名'; とします。 それでライブラリ内の関数を呼び出せるようになります。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。