#!/usr/local/bin/perl #--------------------------# # 簡易掲示板プログラム #--------------------------# $|=1; #データのフラッシュ require './jcode.pl'; #jcode.plへのパス print "Content-type: text/html\n\n"; # データ形式 $file = "bbs.log"; #ログファイルの設定 $temp = "./temp.dat"; #テンポラリーファイル $bgcolor= "#ffffff"; #掲示板の背景色設定 $home = "../../perl/perl8_4.htm"; #戻り先URL #メインルーチン &decode; if ($FORM{'mode'} eq 'write') { &write; } &html; exit; #デコードするためのプログラム sub decode { # プラウザからのデータ取込み if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # プラウザからのデータ変換 @pairs = split(/&/,$buffer); foreach $pair (@pairs) { #1行毎に$name,$valueを取り出す ($name, $value) = split(/=/, $pair); # 変換演算子 tr + を スペースに置き換え $value =~ tr/+/ /; # 変換演算子 s/// 単語の構成文字にマッチ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # " を " に変換 $value =~ s/"/"/g; #\n を "" に変換 $value =~ s/\n//g; # 日本語に変換(デコード処理部分) &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $FORM{$name} = $value; } } #書込み処理プログラム sub write { #フォームの入力状況確認 if ($FORM{'name'} eq '') { &error("お名前が入力されていません。"); } if ($FORM{'msr'} eq '') { &error("メッセージが入力されていません。"); } #ファイルのオープン 予め$fileにログファイル名が代入されている物とします。 open(IN,"$file") || &error("Can't open $file"); open(OUT,">$temp") || &error("Can't write Temp File"); #ログファイルを配列@linesに代入 @lines = ; #ログの逆順処理 @lines = reverse(@lines); #2重書込み禁止ルーチン foreach $line (@lines) { &jcode'convert(*line,'sjis'); local($s1,$s2,$s3,$s4) = split(/<>/,$line); if (($s1 eq $FORM{'name'}) && ($s4 eq $FORM{'msr'})){ &error("二重書き込みは禁止です!!"); } } #書き込むデータの順番を決定 $newrecode="$FORM{'name'}<>$FORM{'email'}<>$FORM{'url'}<>$FORM{'msr'}<>\n"; #配列@linesにデータをPUSH push (@lines,$newrecode); #ログの逆順処理 @lines = reverse(@lines); #ログの書込処理 print OUT @lines; close(OUT); close(IN); rename($temp,$file) || &error("Rename Error"); chmod (0666,$file); if (-e $temp) { unlink($temp); } } #メイン表示プログラム sub html { #ヘッダの読込 &header; #ログの読込 open(IN,"$file") || &error("Can't open $file"); @lines = ; close(IN); #ログ全部? foreach $line (@lines) { local($name,$email,$url,$msr) = split(/<>/,$line); &output; } #フッタの読込 &footer; exit; } #ヘッダ部分プログラム sub header { print <<"EOT"; 簡易掲示板 HOME

簡易掲示板

なまえ:
E-mail:
URL:
メッセージ:


EOT } #リピート部分プログラム sub output { print <<"EOT"; 投稿者:$name E-mail:$email
Homepage:$url
投稿内容
$msr
EOT } #フッタ部分プログラム sub footer { print <<"EOT";
EOT } #エラー処理プログラム sub error { print <<"EOT"; ERROR

ERROR !

$_[0]
EOT exit; }