買い物かご 掲示板 メール DB 利用規定 FAQ サポートBBS


次(ファイルの書きこみ)
前(連想配列)
必要なツール
最低限必要な知識
Make CGI Top
Basic

Home



サブルーチン1 --最低限必要な知識--


サブルーチン

CGIスクリプトのソースコードを見ると、

sub xxx

という文字をあちこちでみかけます。これがサブルーチンです。サブルーチンの定義を書くと難しくなるし、私自身、理屈から学んだわけではないので、やめときますが、簡単に言うと、「一つのCGIスクリプトで、複数の処理を行なわせる」ことです。例によって、正式な定義ではありませんし、この説明を、詳しい人に披露すると笑われますのでご注意を・・・

なぜ、一つのCGIスクリプトで複数のHTMLを生成できるのか・・・

私が初心者の頃、一つのCGIスクリプトで、複数のHTMLを表示できるのがとっても不思議でした。私が初めて作成したスクリプトは、画面ごとにCGIファイルが存在し、全部で10個近いファイルを作成した記憶があります。

参考書を読んでも、再帰サブルーチンだのなんだのと難しいことは書いているのですが、一つのCGIスクリプトで複数のHTMLファイルを作成する方法なんか書いていないし、なかなか解決しなかったものです。

そんなある日、Kent-Webのスクリプトを解析した時、はじめて理解できました。
それは・・・(記憶はあやふやなのであくまで例ですが)




<input type=hidden name=mode value=admin>



<input type=submit value=管理モード>

というHTMLタグ。
で、スクリプト内の文字列を検索すると・・・

if ( $in{'mode'} eq 'admin' ) { &admin; }

というソースコードが!
ひょっとして・・・
再度検索すると、

sub admin { ・・・・

という文字列を見つけました。
そのソースには、管理モードのHTMLタグが書かれていました。

これだ!

いやぁ〜〜〜目からうろことはこのことです。
めちゃ感動しました。
その瞬間、サブルーチンの使い方を覚えました。(最も基本的な使い方ですが)

これで、一つのCGIスクリプトでどうして複数のHTMLを表示出きるのか。そのなぞが解けたのでした。


サブルーチンの例

私のスクリプトを適当に一つ持ってきて、ソースを覗いてみましょう。初期設定があって、デコード処理があって、その下に、

if ( $in{'mode'} eq 'xxx' ) { &xxx; }

が並んでいる個所があります。elsif構文を使っていることもありますし「$in」の代わりに「$FORM」となっていることもあります。

ここで、 各処理に分岐させているのです。

例えば、買い物かごスクリプト(ver2.1)には、

1.かごを取る
2.購入
3.レジへ
4.お買い上げ内容詳細をみる

の4つのボタンがあります。

それぞれのフォームには・・・

かごを取る <input type=hidden name=mode value=regist_2>
購入 <input type=hidden name=mode value=regist>
レジへ <input type=hidden name=mode value=kakunin>
お買い上げ内容の詳細を未る <input type=hidden name=mode value=kakunin_2>

隠し属性(ヒドゥン属性とも言う)がついていますね。設置説明ファイルでは、このタグを入れないとスクリプトが動作しないと注意書きをしています。

で、今度は、shop.cgiを見ましょう。

if ( $FORM{'mode'} eq 'regist' ) { &regist; }
elsif ( $FORM{'mode'} eq 'regist2' ) { &regist2; }
elsif ( $FORM{'mode'} eq 'sendmail' ) { &sendmail; }
elsif ( $FORM{'mode'} eq 'regist_2' ) { &regist_2; }




が見つかると思います。

次に、「regist_2」を検索してみます。いくつか候補があると思いますが、その中に、

# かごを取る処理=============================================================
sub regist_2 {




という文字があるでしょう?

このように、サブルーチンを使うと、一つのスクリプトで複数のHTMLを表示させたり、複数の処理を実行させたりできるのです。


サブルーチンの作り方

最後にサブルーチンの作り方です。参考書を持っている方は、いうまでもなく「公式」はご存知でしょうね。

sub xxx {

・ここに処理内容を書く


}

サブルーチンを作成するには、
「sub」と書いて、半角スペースを入れ、サブルーチン名を書き、さらに、「{」を書きます。

で、一旦改行してから、処理を記述して、全ての処理を書き終わったら、「}」を入力して終わりです。

サブルーチンを呼び出す方法はたくさんありますが、ここでは最も簡単な方法を説明します。

「regit_2」というサブルーチンを呼び出すには・・・
「&regist_2」と書く・・・!

これだけです。簡単でしょ?

上に示したif文による分岐処理は、複数のサブルーチンを行き来するために必要なだけで、基本は「&サブルーチン名」で、呼び出したいサブルーチンを指定するだけなんです。

もしmodeがregist_2ならregist_2というサブルーチンにジャンプしてかごを取りなさい!と、指示しているわけです。 サブルーチン名はなんでもOKですが(もちろん半角英数字のみ)、スペースは使わないように。スクリプト内では、「-ハイフン」の代わりに「_アンダーバー」が使われますので、わかりやすく名前を区切る場合は「_」を使いましょう。

実際にサブルーチンを作ってみる

最後に、実際にサブルーチンを作りましょう。
ここでは、男性向けのページと女性向のページを分岐させるスクリプトです。

該当個所のソースしか書きません。
先に、HTMLでフォームを作成しましょう。ファイル名はなんでもOK。
ここでは仮に、index.htmlとしましょうか・・・

まずフォームでは・・・
<form method=post action=xxx.cgi>
<input type=radio name=mode value=man>男性
<input type=radio name=mode value=woman>女性
<input type=submit value=GO!>
</form>

というタグを入力します。
CGIスクリプトの名前はお好きなように。スクリプトへのパス設定をお間違えなく。

で、CGI側では・・・

初期設定などの必要なソースを入力した後、以下の処理を入力します。

if ( $FORM{'mode'} eq 'man') { &man_html;}
else { &woman_html;}

次に、サブルーチンです。

sub man_html {


ここに男性向けページのHTMLを書く
print文または、ヒアドキュメントを使いましょう。
あ、そうそう、HTML文を始める前には、必ず
print "Content-type: text/html\n\n";
を記述することを忘れないように。

}

sub woman_html {

ここに女性向ページのHTMLを書く
以下同文。


}

jcode.plなどの設定を忘れずに。

完成したら、index.htmlを表示し、性別選択後「GO!」をクリックします。

うまくできましたか?


Web寺子屋 OGIPOGI E-mail:info@web-terakoya.net
Copyright© 2000-2001 OGIPOGI All Rights Reserved.