リスト2:Perlによるゲストブックのソース
(一部--これだけでは正常に機能しません)


#!/usr/local/bin/perl
  ↑perl(インタプリタ)のパスを指定

# ---- 初期設定 ----

  ↓ゲストブックの設置場所
$gbook_url = 'http://www.technido.co.jp/cgi-bin/...';

  ↓保存できる最大数
$max_msg = 50;
  ↓戻り先のURL
$home_url = 'http://www.technido.co.jp/index.html';
  ↓ゲストブックの説明文
$explan ='<CENTER><H2><B>◆超簡単ゲストブック◆</B></H2><BR><FONT size="3">'メッセージを入力して[送信]をクリックしてください。</FONT></CENTER><BR>;
       :
  ↓保存用ファイル
$filename = 'gbook.txt';
  ↓管理用パスワード
$passwd = '123'

# ---- 処理開始 ----

  ↓入力内容によって処理を分岐
if($in{'direction'} eq "delete"){ ←削除
  &delete;
  &delete_html;
}elsif($in{'direction'} eq 'pw'){ ←管理用パスワード
  if($in{'pass'} eq $passwd){
    &delete_html;
  }else{
    &error(pw_err);
  }
}else{
  if($in{'writeon'} eq 'writemsg'){ ←書き込み
    if($in{'message'} eq ""){ ←メッセージが空白のとき
      &error(msg_err);
  }else{
      &write;
      &htmlbase;
    }
  }else{
    &htmlbase;
  }
}

  ↓ブラウザに送信するHTMLの土台
sub htmlbase{
  print "Content-type: text/html\n";
  print "\n";
print <<EOM;
<HTML>
<HEAD>
<TITLE>simple guest book</TITLE>
</HEAD>
<P align="right">
<A HREF="$home_url">表紙へ</A>
<CENTER><TABLE><TR><TD>
$explan ←説明文を挿入
<FORM action="gbook.cgi" method="POST">
<B>メッセージ:</B><INPUT type="text" name="message"size="80"><BR>
           ↑メッセージ用テキストボックス
<BR><BR>
<INPUT type="submit" value="送信"> <INPUT type="reset" value="取消">
           ↑[送信][取消]ボタン
</FORM>
     ↓ファイルのオープン
  if(!open(OUT,"$filename")){&error(file_err);}
  flock(OUT,2);
  @DATA = <OUT>;
  flock(OUT,8);
  close(OUT);

  $count = @DATA;
  $i = 0;
     ↓ファイル内容の表示
  while($count > 0){
    ($date,$message,) = split(/\,/,$DATA[$i]);
    print "$date \n";
   print "<BR>$message<HR>\n";
    $i ++;
    $count --;
  }

<FORM action="gbook.cgi" method="POST">
<INPUT type="hidden" name="direction" value="psw">
<INPUT type="submit" value="管理用パスワード"><INPUT type="password" name="pass" size="20"></FORM>
</BODY>
</HTML>
EOM
}

# 実際の書き込み処理
sub write{
  $message = $in{'message'};

  &jcode'convert(*message,"sjis");

  ↓書き込み日時を取得
  ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
  $mon++;
  @week = ('日','月','火','水','木','金','土');
  $wday = $week[$wday];
  $mon = sprintf("%.2d",$mon);
  $mday = sprintf("%.2d",$mday);
  $hour = sprintf("%.2d",$hour);
  $min = sprintf("%.2d",$min);
  $sec = sprintf("%.2d",$sec);

  $year += 1900;

  $new_msg = "$year/$mon/$mday($wday)$hour:$min:$sec,$name,$comment,\n";

  if(!open(OUT,"$filename")){&error(file_err);}
  flock(OUT,2);
  @DATA = <OUT>;
  flock(OUT,8);
  close(OUT);

  unshift(@DATA,$new_msg);
  $i = 0;
  foreach $line(@DATA){
    $i ++;
    if($i > $max){last;}
    push(@NEWDATA,$line);
  }

  if(!open(IN,">$filename")){&error(file_err);}
  flock(IN,2);
  print IN @NEWDATA;
  flock(IN,8);
  close(IN);
}

# メッセージ削除画面
sub delete_html{
  print "Content-type: text/html\n\n";
print <<EOM;
<HTML>
<HEAD>
<TITLE>delete a message</TITLE>
      :
}

# 実際の削除処理
sub delete{
  if(!open(OUT,"$filename")){&error(file_err);}
  flock(OUT,2);
      :
}

# エラー処理
sub error{
  $error = $_[0];
  if($error eq "msg_err"){
    $errmsg = 'メッセージを入力してください。';
  }elsif($error eq "err_file"){
    $errmsg = 'ファイルがオープンできませんでした。';
  }else{
    $errmsg = '不正なパスワードです。';
  }

  print "Content-type: text/html\n\n";
  print "<HTML><HEAD><TITLE>ERROR</TITLE></HEAD>\n";
  print "<BODY>\n";
  print "<CENTER><B>$errmsg</B></CENTER><HR>\n";
  print "<A href=\"gbook.cgi\">戻る</BODY></HTML>\n";
  exit;
}
-----------------------------------------------------------------------


本文へ戻る