超簡単チャット

 Perlを使って作った超簡単なチャットプログラムをご紹介します。

 まずCGIプログラム本体であるchat.cgi と、データを格納するchat.dat が必要です。又、今回はフォームのデータをデコードするcgi-lib.pl を使います。これは、フォームから送られたエンコードされたデータを、Perlの配列か連想配列に格納するものです。また、これはデータをGET、POSTのどちらの方法でも受け取る事が出来ます。cgi-lib.pl の入手は以下のサイトからどうぞ。

http://cgi-lib.berkeley.edu/

 尚、chat.dat はテキストエディタで適当に作って下さい。全て出来上がったら、CGIを許可されているディレクトリにFTPソフトを使って転送してやります。この時、パーミッションも変更してやりましょう。

chat.cgi ・・・755 chat.dat ・・・666 cgi-lib.pl ・・・644

このチャットの機能の概略

 出来るだけシンプルな物にしたいと思っています。タグの処理は施していないので、一応タグが使えます。又、ファイルの最大記憶数は30に抑えています。オートリロード機能はつけていませんので、リロードしたい時は「送信」ボタンを押して下さい。

スクリプトの内容

 掲示板に比べてチャットの方がスクリプトの内容は簡単で済みます。何しろ処理内容が単純ですから。オートリロード機能なども<META>タグで簡単に設定出来ますので、ご研究あれ!(^o^)丿

初期設定  
#!/usr/local/bin/perl うちのサーバーでは「#!/usr/bin/perl」です。
(この後、必ず1行空けること。)  
require './cgi-lib.pl'; cgi-lib.plライブラリの要求。同じディレクトリ内に置いていると想定。相対パスを使用。
$maxmessage = 30; 最大メッセージ数の指定
$cgifile = './chat.cgi';  
$datafile = './chat.dat';  
$title = '超簡単チャット'; タイトル名を指定
メインの設定  
&ReadParse(*in); 連想配列名の指定
if (&MethPost()) { 「メソッドがPOSTならば」の意味。
$name = $in{'name'};  
$message = $in{'message'};  
}  
if ($message ne "") { 「メッセージが空でなければ」の意味。
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); ★localtime関数<ローカル時間> = localtime[time形式の値]」・・・戻り値はローカル時間が返ってきますが、この時スカラー型の変数で受け取るか、配列で受け取るかで戻ってくる値の形式が異なります。
@dayname = (San, Mon, Tue, Wed, Thr, Fri, Sat); 曜日の指定
$date = sprintf("%04d/%02d/%02d %s %02d:%02d:%02d", $year+1900, $mon+1, $mday, @dayname[$wday], $hour, $min, $sec); ★sprintf関数<フォーマット済み文字列> = sprintf(フォーマット定義,文字)」・・・フォーマットの定義に従って文字列のフォーマットを行い返します。
$tmp = "<FONT color=#ff0000>$name</FONT>"; 変数$tmpにデータを順々に並べて格納する。
$tmp = $tmp . " : $message" ;  
$tmp = $tmp . "<FONT size=-1 color=#009900> $date</FONT><HR>\n"; <HR>は水平線。
open(FILE, "$datafile"); ファイルを読み込みモードで開く。
@allbody = <FILE>;  
close(FILE);  
$num = unshift (@allbody, $tmp); ★unshift関数unshift <配列>, <追加する要素>」・・・配列の先頭に要素を追加します。
if ($num > $maxmessage) { 「もしデータ数が$maxmessageより大きければ」の意味。
pop @allbody; ★pop関数pop(配列変数)」・・・配列変数の最後の要素を取り除いて返します。この時、配列の要素は1つ減ります。
}  
open(FILE, ">$datafile"); ファイルを書き込みモードで開く。
print FILE @allbody;  
close(FILE);  
}  
print "Content-type: text/html\n\n";  
print "<HTML><HEAD><TITLE>" . $title . "</TITLE></HEAD>\n";  
print "<meta http-equiv=Content-Type content=text/html; charset=x-sjis>\n"; 文字コードをSJISに指定。
print "<BODY text=#000000 bgcolor=#ccffcc>\n";  
print "<H2>" . $title . "</H2>\n<HR>\n";  
print "<FORM method=POST action=$cgifile>\n"; フォームの生成。メソッドはPOST指定。
print "<P>お名前:<INPUT type=text name=name size=20 value=\"$name\">"; <P></P>・・・段落を表すタグ。
print " メッセージ:<INPUT type=text size=70 name=message></P>";  
print "<INPUT type=submit value=\"送信\">";  
print "<FONT size=-1> (空のメッセージを送信するとリロードされます。)</FONT>";  
print "</FORM>\n";  
print "<HR>"; <HR>は水平線。
open(FILE, "$datafile");  
while (<FILE>) { FILEの中身がある(真)間は出力処理(print)を実行する、いわゆるループ処理。printの後の変数は省略されている。
print;
}
close(FILE);  
print "</BODY></HTML>\n";  
exit;  

スクリプトの全体像

 分かり易いように、上のサンプルスクリプトのソース全体を示します。実際には処理の流れがつかみ易いように、タブで字下げをして処理の塊を区別できるようにしています。

#!/usr/local/bin/perl

require '../cgi-lib.pl';
#最大メッセージ数の指定
$maxmessage = 30;
$cgifile = './chat.cgi';
$datafile = './chat.dat';
$title = '超簡単チャット';
&ReadParse(*in);
if (&MethPost()) {
 $name = $in{'name'};
 $message = $in{'message'};
}

if ($message ne "") {
 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
 @dayname = (San, Mon, Tue, Wed, Thr, Fri, Sat);
 $date = sprintf("%04d/%02d/%02d %s %02d:%02d:%02d", $year+1900, $mon+1, $mday, @dayname[$wday], $hour, $min, $sec);
 $tmp = "<FONT color=#ff0000>$name</FONT>";
 $tmp = $tmp . " : $message" ;
 $tmp = $tmp . "<FONT size=-1 color=#009900> $date</FONT><HR>\n";
 open(FILE, "$datafile");
 @allbody = <FILE>;
 close(FILE);
 $num = unshift (@allbody, $tmp);
 if ($num > $maxmessage) {
  pop @allbody;
 }
 open(FILE, ">$datafile");
 print FILE @allbody;
 close(FILE);
}

print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>" . $title . "</TITLE></HEAD>\n";
print "<meta http-equiv=Content-Type content=text/html; charset=x-sjis>\n";
print "<BODY text=#000000 bgcolor=#ccffcc>\n";
print "<H2>" . $title . "</H2>\n<HR>\n";
print "<FORM method=POST action=$cgifile>\n";
print "<P>お名前:<INPUT type=text name=name size=20 value=\"$name\">";
print " メッセージ:<INPUT type=text size=70 name=message></P>";
print "<INPUT type=submit value=\"送信\">";
print "<FONT size=-1> (空のメッセージを送信するとリロードされます。)</FONT>";
print "</FORM>\n";
print "<HR>";
open(FILE, "$datafile");
while (<FILE>) {
 print;
}
close(FILE);
print "</BODY></HTML>\n";

exit;

 *上の内容をこのまま複写しても動きません。何故なら、各コードの行頭のスペースが半角でないからです。ご注意下さい。

超簡単アクセスカウンター 前へ

HOME

次へ 超簡単フォームメール