- #!/usr/local/bin/perl
-
- #書き込まれた内容を保存するファイル名
- $datafile='chatdata.html';
-
- #このプログラムのファイル名
- $program='chat2.cgi';
-
-
- print "Content-Type: text/html\n\n";
-
-
- #送られてくる文字列の長さ
- $length=$ENV{'CONTENT_LENGTH'};
-
- #長さ分だけ標準入力から読み込む
- read(STDIN, $buffer, $length);
-
- #文字列ごとに分割する
- ($shimei,$koment)=split( /&/ , $buffer);
-
- #フォーム名と内容に分割する
- ($name,$value1)= split( /=/ , $shimei);
- ($tel,$value2)=split( /=/ , $koment);
-
- #フォームから送られたデータにスペースがあると、
- #プラス(+)に置き換えられるので、
- #スペースにしたままにする変換処理をする
- $value1=~ tr/+/ /;
- $value2=~ tr/+/ /;
-
- #フォームから送られたデータの特殊文字や日本語などは
- # % に続く2桁の16進数に置き換えられるので、
- #それを変換しなおす処理をする
- $value1=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
- $value2=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
-
- #日時を表示するために、次の処理を加える
-
- # localtime関数を使い、秒、分、時、日、年、曜日に分解
- ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time);
-
- #月の値が0〜11になるので、+1して1〜12に補正する
- $mon++;
-
- #西暦を4桁表示にする(2000年対応)
- $yy=$year + 1900;
-
- #日本語の曜日を振り当てる
- @yobi=('日','月','火','水','木','金','土');
-
- #全体を表示させる記述
-
- $nowis="$yy年$mon月$mday日($yobi[$wday])$hour時$min分$sec秒\n";
-
-
- #ハンドル名が空欄だったらエラー表示
- if($value1 eq ""){
- #メッセージを表示
- print "ハンドル名を入力してください。<BR>
- ブラウザで戻って入力をどうぞ。<BR>";
- #プログラムを終える
- exit;
-
- #ハンドル名と発言がともに入力されていたら
- }elsif($value2 ne ""){
- #データファイルを追加書き込みモードで開いて追記
- open(FILE,">>$datafile");
- print FILE "<HR>$value1:$value2 [$nowis]<BR>\n";
- close(FILE);
-
- #ハンドル名があって、発言が空欄だったら
- }else{
-
- }
-
- #ファイル内容を表示リロード
- &browse();
- exit;
-
-
- sub browse{
-
- #データファイルを開いて表示する
-
- #データファイルを読み込み専用モードで開く
- open(FILE,"$datafile");
-
- #内容をブラウザに表示する
- print <FILE>;
-
- #ファイルを閉じる
- close(FILE);
-
-
- #再入力フォームを表示する
- print <<EOF;
- <HR>
- <A NAME="REPLAY"><FORM METHOD="post" ACTION="$program#REPLAY">
- <INPUT TYPE="hidden" NAME="shimei" value="$value1">
- 発言<INPUT TYPE="text" NAME="koment" SIZE=80><P>
- <input type="submit" value="送信する/リロード">
- <input type="reset" value="クリアする"></FORM>
- <HR>
- EOF
- }
-
|
chat1.cgi から変形。
新たに追加・修正した箇所を
青文字で表示
63.ハンドル名が空欄の場合は、
いったんプログラムを終える処理
66.ハンドル名と発言がともに入力されて
いた場合は、通常通り
ファイルに書き込み
73.ハンドル名があって、発言がなかった
場合はリロード処理をする。
*エラー処理をしない理由は、
発言がなくてもリロードをする
ことがあるため
82.ブラウザに表示させる内容の設定
87.datafileに代入されたファイルを表示
97.表示されたものの下に、
再度、入力フォームを表示させる。
programに代入されたcgiを
繰り返し行う(REPLAY)
102.「73〜79」の処理により、
送信ボタンを押すと、自動的に
リロードまで行う
107.このcgiの最後には exit がない
「82」のsub browseの「{」が
「106」で閉じている
このcgi処理が終わるのは 107行目ではなく
「63」または「79」行目 |