|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
フォームデータ取得関数 getformdata関数をライブラリにします。 ライブラリの作り方、ライブラリの使い方を研究します。
関数を作ったのは、その方が分かりやすく、便利だからでした。
getformdataという関数名だけで、それがフォームのデータを所得する機能を
持っているんだなって分かっちゃいますし、
データを取得するのに「$formdata = getformdata();」
ってするだけなので、関数にするとなんだかすっきりして
プログラムが分かりやすくなりますよね。
ある関数が、沢山のCGIプログラムから利用されるくらい便利なものだったら、どうでしょう。 先に作ったgetformdata関数も、フォームからデータを受け取る全てのCGIプログラムで 使えそうですよね。 そういう時、「たしかあそこにgetformdata関数があったなぁ」って getformdata関数を使っているファイルを思い出して、その中から getformdata関数をコピぺする。そんなやり方でも、沢山のCGIプログラムで getformdata関数を利用することができます。でも、これは面倒であんまり便利じゃないし、 困ったことも起こります。 困ったことというのは、getformdata関数になにか不具合(バグっていいます)があった場合。 たとえば、日本語を受け取った時に、%〜っていう風になったままになってるとか。 (実際、そうなんですよね (^^;) だって、getformdata関数はあちこちのCGIプログラムにコピペされちゃってますから、 修正したgetformdata関数を、あちこちにコピペし直さなきゃいけません。 これは大変ですよ!
コピペなんてする必要はありません。ライブラリにしましょう!
ライブラリというのは、関数を集めたもの、です。 今回は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したあとにパーミッションを変更する必要は無いです。
#!/usr/bin/perl require 'getformdata.pl'; print "Content-type: text/html\n"; print "\n"; $formdata = getformdata(); print "formdata : $formdata";
sub getformdata
{
local $formdata;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$formdata = $ENV{'QUERY_STRING'};
}
else {
read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'});
}
return $formdata;
}
1;
下の入力ボックスに文字列を入力して、送信ボタンを押してください。 別窓が開きます。
ライブラリを作るっていうのは、結構簡単でした。ファイルの最後に 1; を付けるのさえ 忘れなければ他に面倒なことはありません。FTPするときにテキストモードにするのを 忘れないようにすればいいだけですね。こんなに簡単に作れるライブラリですが、 ライブラリにすることで、CGIプログラムがなんとすっきりすることか! なんか、フォームからデータを受信するのに費やした苦労がすっぽり抜けてしまったかの ようなシンプルさ。素晴らしいじゃないですか (^^;
ライブラリにしましたから、getformdata関数を使いたいときは require 'getformdata.pl';って
するだけでOKです。便利ですね〜!
まだCGIプログラムを作り始めたばかりなのでライブラリの便利さっていうのは 実感できませんが、これから何度も使うことになるだろう getformdata関数をこれだけ 簡単に呼び出せるっていうのはなんだか嬉しくなります。 getformdata関数以外にも、いろんなCGIプログラムで利用できるくらい便利なものが作れたら、 どんどんライブラリにして再利用するようにしましょう! CGIプログラムを作るときには、「これは関数にすべきかな?ライブラリにすべきかな?」って 考えながら作るようにすると良さそうですね。
|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
| Copyright (c) 'PERL-LABO' All Rights Reserved. リンクフリーです。 |