TOPページ >> CGI@ >> CGIA >> CGIB

CGIを使ってみよう プログラミング



■CGIを作ってみる

■CGIプログラムの流れ

@Apacheの起動

「スタート → すべてのファイル → Apache HTTP Server 2.0.55
→ Control Apache Server → Start
Help

まずはじめにApacheを起動しておいてください。
パソコンを起動した後に一回だけ起動すればOKです。
パソコン起動時に自動的にApacheが起動している場合もあります。
その場合は、もう一度起動しようとするとエラーが出るかもしれませんが、 エラーが出ても気にしないでください。

2回目以降 CGIプログラムを動かすときは、
「Start」ではなく「Restart」をしてください。

Aテキストエディタを起動して、プログラムのソースコードを記述します。
「C:/Apache2/public_html」に保存してください。

Bブラウザにファイルパスを入力してエンターキーを押します。

C:/Apache2/public_html/・・・ ファイルパスのこの部分を

http://localhost/・・・ このように置き換えればOKです


■Hello Perl

まずはじめに、画面に「Hello Perl」と表示するCGIを作ってみましょう。


●ソースコード
この3行だけです。

#!c:\perl\bin\perl

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

●各ソースコードの解説

#!c:\Perl\bin\perl (下は一行空ける)
Perlを実行するために必要な、インタプリンタというプログラムが置いてあるパスです。
Perlは単体では実行できないプログラムなのです。
このようなプログラムをスクリプトと呼ぶことがあります。

print "Content-type: text/html\n\n"; これはCGIヘッダです。サーバーからブラウザに送信されるときに必要なものです。
そういうものなんだなと思ってもらえばいいです。

print "Hello perl";
この行では「print」という関数を使っています。
関数とは、指定された処理を行う命令のことです。

print関数は「文字列を出力する」という処理を行わせます。
関数には、関数名の後にスペースを空けたあとに、 「引数」という命令の補助条件を指定するパラメータを置きます。
この場合の引数はダブルクォート「"」で囲まれた文字列です。

print 関数名
"Hello perl" 引数

ということになり、「Hello perl」という文字列を出力せよという命令になります。

関数呼び出し行の末尾のセミコロン「;」は、文の区切りを示します。
ピリオドのようなものです。付け忘れるとエラーが出ます。

「\n」は改行を行います。

今回のプログラムは、
サーバー 〜 クライアント間で次のように出力されます。
#!c:\perl\bin\perl

print "Content-type: text/html\n\n";
print "Hello perl";
ます、上のプログラムが以下のようにサーバーに出力されます。
Content-type: text/html

Hello perl
そしてクライアントには以下の一行だけブラウザに出力されます。
Hello perl


■プログラムで計算をする

今度はただ指定した文字列を表示するのではなく、
プログラムを使って計算をさせるということをやります。


ここでは3+5の答えを表示するプログラムを作ります。

●ソースコードと解説
#!c:\perl\bin\perl

print "Content-type: text/html\n\n";
$a=5;
$b=3+5;
print "3+5の答えは$bです";
Perlでは、名前の先頭に$の着いたものは変数として扱われます。

$a=5; では、5という数字を$aという変数に代入しています。

$b=3+5; では、3+5を計算して、結果を$bという変数に代入しています。

print "3+5の答えは$bです"; では、変数$bの部分が、 変数の中身である3+5の答え「8」に置換されて出力しています。


■サイコロプログラム

今までのCGIは、結局は静的ページに過ぎませんでしたが、
今回は表示するたびに表示結果の違う動的ページです。


ブラウザにランダムで数字が表示され、その数字と同じ数の「@」が表示されます。

●ソースコードと解説
#!c:\perl\bin\perl

print "Content-type: text/html\n\n";
$a = int(rand 6) +1;
print "$a";
while($a > 0) {
print " @ " ;
--$a; }

$a = int(rand 6) +1;
この行では、まず「rand 6」の部分で、ランダムに0〜5までの 数字を呼び出すという処理をしています。
「int」で、0〜5までの数字のうち、整数だけを抜き出しています。
それに1を足すことにより、$aに 1,2,3,4,5,6のうち一つがランダムで代入されます。

while($a > 0) { print "@"; --$a; }
このwhile文では、()の中の条件が満たされている限り、
{}の中の処理を繰り返す。という処理を行います。

($a > 0) となっているので、$aが0より大きい限り、
{}の中の処理を繰り返すわけです。

--$a は、「$a = $a - 1」と同じ意味で、$aの値から1を引くという処理を行います。
この処理を行うことによって、while文による繰り返し作業が行われる毎に$aの値が1ずつ減っていくので、
ランダムに選ばれた数字が"3"であった場合、@を出力する作業を3回繰り返した後、
$aの値は0になり、繰り返し作業終了となるわけです。



■テキストファイルの一部を読み込んで表示



というようなテキストファイル「abc.txt」があった場合。
このテキストファイルの始めの3行だけを抜き取って表示するというプログラムです。



abc.txt はこちら

●ソースコードと解説
#!c:\perl\bin\perl

print "Content-type: text/html\n\n";
open(FILE, "<abc.txt"); #abc.txtというファイルを読み込み
@data=<FILE>; #abc.txtを@dataに代入
close <FILE>; #ファイルを閉じます
print "@data[0]<br>"; #1行目を表示して改行
print "@data[1]<br>"; #2行目を表示して改行
print "@data[2]<br>"; #3行目を表示して改行

#から後ろは、「コメント」となり、ラクガキをしてもプログラムには反映されません。
プログラムだけだと、どうしても人間には内容がわかりにくいので、
わかりやすいコメントを入れておくことで、プログラムが見やすくなります。

open(FILE, "<abc.txt");
「open」は、コメントの通り引数で指定したファイルを読み込む関数です。
「FILE」はファイルハンドルと言い、複数のファイルを開いたときなどに 個々を指定する時などに使います。
「<」は読み込み専用で開くという意味です。

close <FILE>;
その名の通り、指定したファイルを閉じます。

print "@data[0]<br>";
読み込んだファイルを@dataという名前のデータの入れ物の中に入れています。
この入れ物は、「配列」と言い、変数の塊のようなものです。
名前の先頭に「$」がつくと変数、「@」がつくと配列となります。

変数と配列については↓のようになっています。



print "@data[0]<br>";
そして、最後のprint行で、読み込んだテキストデータのうち上から3行までを
順番に表示して<br>で改行・・・という処理をして表示しています。


■アクセスカウンター

表示するたびに1ずつ数字が増えていきます。
ようやくCGIらしくなってきました。


●ソースコードと解説
#!c:\perl\bin\perl

print "Content-type: text/html\n\n";
open(READ, "<log.dat");
$count=<READ>;
close <READ>;
++$count;
open(WRITE, ">log.dat");
print WRITE, $count;
close <WRITE>;
print "あなたは$count番目の訪問者です";

open(READ, "<log.dat");
今までのアクセス数を保存している、datファイルというものを呼び出しています。
アクセスカウンターは、文字を表示したり、計算をしたり、ランダムで数字を選んだりするプログラムと違い、
今までの数字を記録しておかないといけません。

テキストファイルの一部を読み込んで表示するプログラムを応用して、 今までのアクセス数を呼び出し、
表示して、また保存するという作業が必要になります。

そのアクセス数を保存しておくのが、datファイルです。
作り方としては、普通のテキストファイルに「0」とだけ書き込んで保存して、
ファイルの拡張子を「.dat」に変えるだけ。
これがdatファイルです。(右クリック → 対象をファイルに保存)

テキストファイルの一部を読み込んで表示するプログラムでは、ファイルハンドルの名前を<FILE> としましたが、今回は<READ>となっています。名前は自由に決めてよいですが、
「大文字アルファベットで書くこと」 「closeで閉じるまで同じ名前を使うこと」
の2つを守ってください。

$count=<READ>;
読み込んだアクセス数を$countに代入します。

close <READ>;
読み込んだら、datファイルは一度閉じます。

++$count;
サイコロプログラムに出てきたものと同類で、$countの値に1を足します。

open(WRITE, ">log.dat");
先ほどは「<」読み込み用で開いたのに対して、今度は「>」書き込み用で開きます。

print WRITE, $count;
これは、WRITEと$countの内容を画面に出力するのではなく、 datファイルに、数字が加算された$countの中身を書き込むという処理をしています。

print "あなたは$count番目の訪問者です";
ここがアクセスカウンターとして表示される部分です。


TOPページに戻る
Copyright (c) 2006 Akihisa Minagawa. All rights reserved.