名 前(ハンドル名)
 
最初のコメント
 



【超シンプルチャット】 (空欄時のエラー処理・リロード処理)

【ソース】 chat2.cgi 【解説】
  1. #!/usr/local/bin/perl
  2. #書き込まれた内容を保存するファイル名
  3. $datafile='chatdata.html';
  4. #このプログラムのファイル名
  5. $program='chat2.cgi';
  6. print "Content-Type: text/html\n\n";
  7. #送られてくる文字列の長さ
  8. $length=$ENV{'CONTENT_LENGTH'};
  9. #長さ分だけ標準入力から読み込む
  10. read(STDIN, $buffer, $length);
  11. #文字列ごとに分割する
  12. ($shimei,$koment)=split( /&/ , $buffer);
  13. #フォーム名と内容に分割する
  14. ($name,$value1)= split( /=/ , $shimei);
  15. ($tel,$value2)=split( /=/ , $koment);
  16. #フォームから送られたデータにスペースがあると、
  17. #プラス(+)に置き換えられるので、
  18. #スペースにしたままにする変換処理をする
  19. $value1=~ tr/+/ /;
  20. $value2=~ tr/+/ /;
  21. #フォームから送られたデータの特殊文字や日本語などは
  22. # % に続く2桁の16進数に置き換えられるので、
  23. #それを変換しなおす処理をする
  24. $value1=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
  25. $value2=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
  26. #日時を表示するために、次の処理を加える
  27. # localtime関数を使い、秒、分、時、日、年、曜日に分解
  28. ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time);
  29. #月の値が0〜11になるので、+1して1〜12に補正する
  30. $mon++;
  31. #西暦を4桁表示にする(2000年対応)
  32. $yy=$year + 1900;
  33. #日本語の曜日を振り当てる
  34. @yobi=('日','月','火','水','木','金','土');
  35. #全体を表示させる記述
  36. $nowis="$yy年$mon月$mday日($yobi[$wday])$hour時$min分$sec秒\n";
  37. #ハンドル名が空欄だったらエラー表示
  38. if($value1 eq ""){
  39. #メッセージを表示
  40. print "ハンドル名を入力してください。<BR>
  41. ブラウザで戻って入力をどうぞ。<BR>";
  42. #プログラムを終える
  43. exit;
  44. #ハンドル名と発言がともに入力されていたら
  45. }elsif($value2 ne ""){
  46. #データファイルを追加書き込みモードで開いて追記
  47. open(FILE,">>$datafile");
  48. print FILE "<HR>$value1:$value2 [$nowis]<BR>\n";
  49. close(FILE);
  50. #ハンドル名があって、発言が空欄だったら
  51. }else{
  52. }
  53. #ファイル内容を表示リロード
  54. &browse();
  55. exit;
  56. sub browse{
  57. #データファイルを開いて表示する
  58. #データファイルを読み込み専用モードで開く
  59. open(FILE,"$datafile");
  60. #内容をブラウザに表示する
  61. print <FILE>;
  62. #ファイルを閉じる
  63. close(FILE);
  64. #再入力フォームを表示する
  65. print <<EOF;
  66. <HR>
  67. <A NAME="REPLAY"><FORM METHOD="post" ACTION="$program#REPLAY">
  68. <INPUT TYPE="hidden" NAME="shimei" value="$value1">
  69. 発言<INPUT TYPE="text" NAME="koment" SIZE=80><P>
  70. <input type="submit" value="送信する/リロード">
  71. <input type="reset" value="クリアする"></FORM>
  72. <HR>
  73. EOF
  74. }
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」行目

cgiの流れとしては
(1) 「1〜56行」を処理 
        次の処理は、入力されたデータによって、3パターンに分かれる
(2) 「57〜63行」で、「ハンドル名」がなければ文字を表示してcgi終了
          (ブラウザの戻るボタンで戻ってから改めてcgiを動かすことになる)
(2) 「65〜70行」で、(すでにハンドル名があるものだけが抽出されている)
          「発言」があれば情報を書き込んで続行、「77行目」へ
(2) 「72〜75行」で、「発言」がなくても、素通りする処理、「77行目」へ
(3) 「77〜79」で、browse(つまりを「82〜106行」)を読み込んでからcgi終了
(「82〜106行」では、
   ・ファイルに書き込まれた内容を表示し、
   ・新しく書き込みフォームを表示させる  処理を行っている)         
*(3)まで行って終了した場合、またブラウザから書き込み、送信ボタンを押すと、
  program に代入された「chat2.cgi」、つまりこのcgiが最初から作動する。