「CGI_掲示板2_指定データ表示」の編集履歴(バックアップ)一覧はこちら
「CGI_掲示板2_指定データ表示」(2008/07/12 (土) 14:38:24) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><br /><br /><br />
#!/usr/local/bin/perl</p>
<p># 掲示板2(フレームを利用したパターン)右画面</p>
<p># id=bbs2.cgi</p>
<p># update. 01.9.16</p>
<p># 使用上の注意・・・漢字コードの変換が不完全ですので文字化けするおそれがあります。<br />
# そのつもりでお使い下さい。</p>
<p># 日本語コード変換ライブラリ(v2.0)の指定<br />
# &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される </p>
<p>require 'cgi-lib.pl';<br />
require 'jcode.pl';<br />
&ReadParse;</p>
<p># 設置するURLを設定<br />
$reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/bbs2.cgi';</p>
<p>$file = "/dialup/chichibu/cgi-bin/bbs2.dat";<br />
$sendmail = '/usr/lib/sendmail';</p>
<p># 掲示板へ記入したら管理者へメール通知するならON<br />
$send="on";<br />
# メールの送り先<br />
$myaddress = <a href="mailto:">'chichibu@po.kumagaya.or.jp'</a>;</p>
<p># データ確認デバッグモード(通常は$test=""、各画面で変数状態を見たいときは"on")<br />
$test="";</p>
<p># 最大登録数<br />
$max=200;<br />
# メッセージの文字数制限(この値の半分が漢字数)<br />
$mojisu = 200;<br />
# 表示期間の設定(設定した日数後のファイル更新時に消去します、消去しない場合は0)<br />
$syokyo=7; # 1週間後</p>
<p># 1画面表示件数<br />
$gyosu=10 ;</p>
<p>####################################<br />
# #<br />
# メインルーチン(処理の分岐) #<br />
# #<br />
####################################</p>
<p># 消去日計算<br />
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime(time);<br />
$mm++;<br />
# 2桁化<br />
$mm = sprintf("%.2d",$mm);<br />
$dd = sprintf("%.2d",$dd);<br />
# 西暦4桁処理<br />
if ($yy < 70) { $yy = $yy + 2000;}<br />
else { $yy = $yy + 1900;}<br />
# 本日<br />
$ymd=$yy.$mm.$dd;</p>
<p><br />
$page=$in{'page'};<br />
$syurui=$in{'syurui'};<br />
# 最初に渡された状態セーブ<br />
$syurui_sv=$syurui;</p>
<p># 該当データを調べる<br />
if ($syurui ne "all") { &read4 }</p>
<p># 全体の流れを決定する<br />
if ($in{'action'} eq 'main') { &main; }</p>
<p>elsif ($in{'action'} eq 'kinyu') { &kinyu; }</p>
<p>elsif ($in{'action'} eq 'check') { &check; &main; }</p>
<p>elsif ($in{'action'} eq 'meisai') { &meisai; }</p>
<p>elsif ($in{'action'} eq 'next') { &next; }</p>
<p>elsif ($in{'action'} eq 'back') { &back; }</p>
<p>elsif ($in{'action'} eq 'narabi') { &narabi; }<br />
# メール送信画面<br />
elsif ($in{'action'} eq 'email') { &email; }</p>
<p># 詳細表示画面<br />
elsif ($in{'action'} eq 'teisei') {&teisei;&main; }</p>
<p>else { &first; }</p>
<p># なくても良いが最終出口を示す<br />
exit;</p>
<p>#############################################<br />
# #<br />
# データを読む # <br />
# #<br />
############################################# </p>
<p>sub read {</p>
<p># データを読み各連想配列に加算する<br />
# 1 2 3 4 5 6<br />
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード<br />
$j=0;<br />
# 配列の初期化<br />
@data=();</p>
<p>open(DB,"$file");<br />
flock(DB,2);<br />
while (<DB>) {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_); </p>
<p># とりあえずキーがないデータを表示しないため<br />
if ($dt1 ne "") {</p>
<p><br />
# 表示期限チェック<br />
if ($dt5 > 0 && $dt5 >= $ymd) {<br />
# 9は全部、他は指定分類のみ、指定なしも全件<br />
if ($syurui eq "all") { $data[$j]=$_ ;$j++}<br />
elsif ($syurui eq $dt2) { $data[$j]=$_ ;$j++}<br />
} # end of if</p>
<p>} # とりあえずここまで</p>
<p>} # end of while</p>
<p>flock(DB,8);<br />
close(DB);<br />
# データ数<br /><a href="mailto:$cnt=@data">$cnt=@data</a>;</p>
<p>} # end of read<br />
#############################################<br />
# #<br />
# 登録データを読む(訂正削除用配列) # <br />
# #<br />
############################################# </p>
<p>sub read2 {</p>
<p># データを読み各連想配列に加算する<br />
open(DB,"$file");<br />
flock(DB,2);<br />
@data=<DB>;<br />
flock(DB,8);<br />
close(DB);</p>
<p># データ数<br /><a href="mailto:$cnt=@data">$cnt=@data</a>;<br />
# 配列の初期化<br />
%idxdt=();</p>
<p># 各レコードを日時をキーにした連想配列にセットする<br />
foreach (@data) {<br />
($idx,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_); </p>
<p># キーを変数名に入れて1レコード全体をセットする<br />
$idxdt{$idx} = $_;<br />
} # end of foreach</p>
<p>} # end of read2<br />
#############################################<br />
# #<br />
# データを読む(全件) # <br />
# #<br />
############################################# </p>
<p>sub read3 {<br />
open(DB,"$file");<br />
flock(DB,2);<br />
@data=<DB>;<br />
flock(DB,8);<br />
close(DB);<br />
} # end of read3</p>
<p><br />
#############################################<br />
# <br />
# アンカータグで渡されたキーデータから該当内容を調べる <br />
# <br />
############################################# </p>
<p>sub read4 {</p>
<p>open(DB,"$file");<br />
flock(DB,2);</p>
<p>while (<DB>) {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_); <br />
# 指定レコードキーがあったらそのレコードの宛先をセットする<br />
if ($syurui == $dt1) { $syurui=$dt2 ;last ; }</p>
<p>} # end of while</p>
<p>flock(DB,8);<br />
close(DB);</p>
<p>} # end of read4<br />
########################<br />
# #<br />
# 項目分解ルーチン #<br />
# #<br />
########################<br />
sub bunkai {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$bundt);</p>
<p># 日付時刻分解<br />
$yy=substr($dt1,0,4);<br />
$mm=substr($dt1,4,2);<br />
$dd=substr($dt1,6,2);<br />
$ji=substr($dt1,8,2);<br />
$fun=substr($dt1,10,2);<br />
$byo=substr($dt1,12,2);<br />
$nichiji=$yy.$mm.$dd.$ji.$fun.$byo;<br />
$hizuke="$yy年$mm月$dd日$ji時$fun分";<br />
$hizuke1="$yy年$mm月$dd日";<br />
$hizuke2="$ji時$fun分";<br />
# 番号</p>
<p># 内容の改行を元に戻す<br />
$dt3 =~ s/&k/\n/g;<br />
# 表示用に変換する<br />
$naiyo2 = $dt3;<br />
$naiyo2 =~ s/\n/<BR>/g;</p>
<p>} # end of bunkai</p>
<p>#############################################<br />
# #<br />
# 最初に処理するルーチン # <br />
# #<br />
############################################# </p>
<p>sub first {</p>
<p>print "Content-type: text/html\n\n";</p>
<p>print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板2</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
EOM</p>
<p>print '<BR><BR><FONT size=5 color="blue">';<br />
print
'<CENTER>左側から表示させる内容を選択してください</CENTER></FONT>'."\n";<br />
print '<BR><BR>'."\n";<br />
$page=1;<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="kinyu">' . "\n";<br />
print '<input type=submit value=" 記入画面へ ">' . "\n";<br />
&hidpara;<br />
print '</FORM>';</p>
<p>print '</BODY></HTML>'. "\n";</p>
<p>} # end of first</p>
<p>#############################################<br />
# #<br />
# メイン処理画面を表示する # <br />
# #<br />
############################################# </p>
<p>sub main {</p>
<p># 表示用変数<br />
$page = $in{'page'};<br />
$sortkb = $in{'sortkb'} ;</p>
<p>&read;</p>
<p># 昇順にする<br />
if ($sortkb == 1) { @data=reverse(@data);}<br />
# ページ数計算<br />
$page_max = (($cnt-1) / $gyosu) + 1;<br />
# 整数部をとりだす<br />
($page_max,$dummy)=split(/\./,$page_max);</p>
<p># 表示出力処理<br />
print "Content-type: text/html\n\n";<br />
print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板2</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
EOM</p>
<p>print '<TABLE BORDER="1">';<br />
print '<TR><TD>';<br />
print '<FONT SIZE=3 COLOR=#0000FF>'."\n";<br />
print '掲示板2'."\n";<br />
print '</FONT></TD>';<br />
print '<TD>指定データ</TD>';</p>
<p>print "<TH>該当件数</TH><TH><FONT
COLOR=#0000FF>表示頁</FONT></TH><TH>最終頁</TH></TR>\n";</p>
<p>print '<TR VALIGN="MIDDLE"><TD ALIGN="CENTER">';<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="kinyu">' . "\n";<br />
print '<input type=submit value=" 記入画面へ ">' . "\n";<br />
&hidpara;<br />
print '</FORM>';<br />
print '</TD>';<br />
if ($syurui eq "all") { $sitei="全件" } else { $sitei=$syurui }<br />
print "<TD ALIGN=\"CENTER\"><FONT
COLOR=#AA0000>$sitei</FONT></TD>\n";</p>
<p>print "<TD ALIGN=\"right\"><FONT
COLOR=#AA0000>$cnt</FONT></TD><TD ALIGN=\"right\"><FONT
COLOR=#0000FF>$page</FONT></TD>\n";<br />
print "<TD ALIGN=\"right\"><FONT
COLOR=#AA0000>$page_max</FONT></TD>\n";<br />
print '</TR></TABLE>'."\n";</p>
<p># 前頁表示</p>
<p># ボタンを並べる<br />
# 上段<br />
print '<TABLE BGCOLOR="#ffffCC">';<br />
print '<TR VALIGN="BOTTOM">';<br />
# 表示順序<br />
print '<TD>';<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="narabi">' . "\n";<br />
&hidpara;<br />
if ($sortkb == 0) { $sortkbn = "日付の古いものを先に"; }<br />
else { $sortkbn = "日付の新しいものを先に"; }<br />
print '<input type=submit value="'.$sortkbn.'">' . "\n";<br />
print '</FORM>'. "\n";<br />
print '</TD>';<br />
print '<TD> </TD>';<br />
# 前頁表示<br />
print '<TD>';<br />
if ($page == 1) { print ' '; }<br />
else {<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="back">' . "\n";<br />
&hidpara;<br />
print '<input type=submit value="前頁">' . "\n";<br />
print '</FORM>';<br />
} # end of if</p>
<p>print '</TD>';<br />
print '<TD> </TD>';<br />
# 次頁表示<br />
print '<TD>';<br />
if ($page == $page_max) { print ' '; }<br />
else {<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="next">' . "\n";<br />
&hidpara;<br />
print '<input type=submit value="次頁">' . "\n";<br />
print '</FORM>'. "\n";<br />
} # end of if<br />
print '</TD>';<br />
print '<TD> </TD>';</p>
<p>print '</TR></TABLE>'."\n";<br />
print '</FORM>'. "\n";</p>
<p># 該当データが0件の場合<br />
if ($cnt == 0) {<br />
print '<BR><BR><FONT size=5 color="blue">';<br />
print
'<CENTER>該当データは0件です、選択内容を変えてご覧ください</CENTER></FONT>'."\n";<br />
return } # end of if</p>
<p># 最初は詳細形式を表示する<br />
&disp3;</p>
<p>} # end of main</p>
<p>#################################<br />
# hiddenパラメータ共通項目 #<br />
#################################<br />
sub hidpara {<br />
print '<input type=hidden name="page" value="'.$page.'">'."\n";<br />
print '<input type=hidden name="sortkb" value="'.$in{'sortkb'}.'">' .
"\n";<br />
print '<input type=hidden name="syurui" value="'.$syurui_sv.'">' .
"\n";<br />
} # end of hidpara</p>
<p>##########################<br />
# #<br />
# 詳細表示ルーチン #<br />
# #<br />
##########################<br />
sub disp3 {</p>
<p>print "<TABLE BORDER=\"1\" WIDTH=\"100%\" >\n";<br />
print
"<TR><TH>№</TH><TH>宛先</TH><TH>日付</TH><TH>内 容</TH><TH>差出人</TH></TR>\n";</p>
<p># 行数分だけ繰り返す<br />
for($i=1; $i<=$gyosu; $i++) {</p>
<p>#print '<TR>';<br />
# 1列目はページカウンタ*行数+$i</p>
<p>$lno=$gyosu * ($page - 1) + $i;<br />
$no=$lno-1;</p>
<p># 項目分解処理<br />
$bundt=$data[$no];<br />
&bunkai;</p>
<p># 分類別色<br />
$iro=$buncol[$bunrui];</p>
<p>print '<TR>';<br />
print '<TD ALIGN="right"><FONT
COLOR='.$iro.'>'.$lno.'</FONT>'."\n";<br />
if ($test eq "on") { print '<BR>'.$bundt.''."\n"; } # テスト表示<br />
print '</TD>'."\n";<br />
print '<TD ALIGN="left" NOWRAP><FONT
COLOR='.$iro.'>'.$dt2.'</FONT></TD>';<br />
print '<TD ALIGN="left" NOWRAP><FONT
COLOR='.$iro.'>'.$hizuke1.'<BR>'.$hizuke2.'</FONT></TD>';<br />
print '<TD ALIGN="left"><FONT COLOR='.$iro.'>';<br />
$act="meisai";<br />
print '<A HREF =
"'.$reload.'?action='.$act.'&keyno='.$dt1.'&tbno='.$lno.'&page='.$page.'&sortkb='.$sortkb.'">'.$naiyo2.'</A>';<br />
print '</FONT><BR>'."\n";<br />
print '</TD>'."\n";<br />
print '<TD ALIGN="left"><FONT
COLOR='.$iro.'>'.$dt4.'</FONT></TD>'."\n";<br />
print '</TD>'."\n";<br />
#print '<TD ALIGN="left"><FONT
COLOR='.$iro.'>'.$dt5.'</FONT></TD>'."\n";<br />
#print '</TD>'."\n";<br />
#print '<TD ALIGN="left"><FONT
COLOR='.$iro.'>'.$dt6.'</FONT></TD>'."\n";<br />
print '</TR>'."\n";</p>
<p># 最終データを表示したら抜ける<br />
if ($lno >= $cnt) { last }</p>
<p>} # end of for</p>
<p>print '</TABLE>';<br />
print "</BODY></HTML>\n";</p>
<p>} # end of disp3</p>
<p><br />
#############################################<br />
# #<br />
# 掲示板新規記入処理 # <br />
# #<br />
############################################# </p>
<p>sub kinyu {<br />
# 消去日が設定してある場合<br />
if ($syokyo > 0) {<br />
# 消去日計算<br />
$syokyobyo = $syokyo * 60 * 60 * 24;<br />
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime(time + $syokyobyo);<br />
$mm++;<br />
# 2桁化<br />
$mm = sprintf("%.2d",$mm);<br />
$dd = sprintf("%.2d",$dd);<br />
$ji = sprintf("%.2d",$ji);<br />
$fun = sprintf("%.2d",$fun);<br />
$byo = sprintf("%.2d",$byo);<br />
# 西暦4桁処理<br />
if ($yy < 70) { $yy = $yy + 2000;}<br />
else { $yy = $yy + 1900;}<br />
# 消去日<br />
$symd=$yy.$mm.$dd;<br />
} # end of if<br />
else { $symd=0 } # end of else</p>
<p>print "Content-type: text/html\n\n";</p>
<p>print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板への記入</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
<H2>掲示板への記入</H2><br />
EOM</p>
<p># 外側の飾り線(画面の設定によってはわくとして表示しないことがある)<br />
print '<TABLE BORDER="10" CELLPADDING="10" WIDTH="100%">';<br />
print '<TR>';</p>
<p>print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="check">' . "\n";<br />
# 左画面から指定された宛先があれば表示させる<br />
if ($syurui eq "all") { $atesaki = "" } else { $atesaki = $syurui }<br />
print '宛先 <input type=text name="namae" size="40" MAXLENGTH="40"
value="'.$atesaki.'"><br>'."\n";<br />
print '<BR>';<br />
print 'メッセージをどうぞ(漢字の場合100文字以内)';<br />
print '<BR>';<br />
print '<TEXTAREA NAME="naiyo" COLS=70 ROWS=5></TEXTAREA>' .
"\n";<br />
print '<BR><BR>';</p>
<p>print '差出人 <input type=text name="sasidasi" size="40" MAXLENGTH="40">'
. "\n";<br />
print '<BR><BR>';</p>
<p>print '<FONT COLOR=#AA0000>';<br />
print '登録後にあなたが訂正削除する場合に必要。未設定時は訂正削除不可';<br />
print '</FONT>';<br />
print '<BR>';<br />
print '訂正削除パスワード <input type=text name="pwd1" size="10" MAXLENGTH="10">'
. "\n";<br />
print '<BR><BR>';</p>
<p>print '<FONT COLOR=#AA0000>';<br />
print "表示期限は本日より $syokyo日間です、要変更の場合は訂正して下さい\n";<br />
print '<BR>';<br />
print '</FONT>';<br />
print '表示期限 <input type=text name="symd" size="10" MAXLENGTH="10"
value="'.$symd.'">' . "\n";<br />
print '<BR>';<br />
print '<TABLE BGCOLOR="#ffffCC">';<br />
print '<TR VALIGN="BOTTOM">';<br />
# 表示順序<br />
print '<TD>';<br />
print '<input type=submit value="登録">' . "\n";<br />
print '</TD>';<br />
print '<TD> </TD>';<br />
print '<TD>';<br />
print '<input type=reset value="入力内容取消">' . "\n";</p>
<p># 登録日時セット<br />
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime;<br />
$mm++;<br />
# 2桁化<br />
$mm = sprintf("%.2d",$mm);<br />
$dd = sprintf("%.2d",$dd);<br />
$ji = sprintf("%.2d",$ji);<br />
$fun = sprintf("%.2d",$fun);<br />
$byo = sprintf("%.2d",$byo);<br />
# 西暦4桁処理<br />
if ($yy < 70) { $yy = $yy + 2000;}<br />
else { $yy = $yy + 1900;}<br />
# 登録日時<br />
$nichiji=$yy.$mm.$dd.$ji.$fun.$byo;</p>
<p># ここで同時刻に登録しようとした場合を考えてキーをユニーク(唯一)にするため<br />
# 日時の後に4桁のランダム数字を足す(これでも同一になった場合は訂正時1つのデータ消滅する)<br />
srand;<br />
$a=rand;<br />
$no4=substr($a,index($a,".")+1,4);<br />
if ($no4 == 0) { $no4 = "0000"; }<br />
$nichiji.=$no4;<br />
print '<input type=hidden name="nichiji" value="'.$nichiji.'">' .
"\n";</p>
<p># 共通データ渡し<br />
$syurui_sv=$nichiji;<br />
&hidpara;<br />
print '</FORM>'. "\n";<br />
print '</TD>';<br />
print '<TD> </TD>';<br />
print '<TD>';<br />
# 戻る<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="main">' . "\n";<br />
print '<input type=submit value="記入せずに戻る">' . "\n";</p>
<p># 最初の画面から来たときは何も指定データがないから<br />
if ($syurui eq "") { $syurui="all" }<br />
$syurui_sv=$syurui;<br />
&hidpara;<br />
print '</TD></TR></TABLE>'."\n";</p>
<p><br />
print '</FORM>'. "\n";</p>
<p># 外側の飾り線<br />
print '</TR></TABLE>';</p>
<p>print '</BODY></HTML>'. "\n";<br />
} # end of kinyu</p>
<p>##########################################<br />
# #<br />
# 入力されたデータのチェックルーチン #<br />
# #<br />
##########################################</p>
<p>sub check {</p>
<p>&form_data;</p>
<p># 宛名がない場合<br />
if ($namae eq "" ) { &error(2); }<br />
# 差出人がない場合<br />
if ($sasidasi eq "" ) { &error(3); }</p>
<p># チェック通過、更新へ<br />
&update;</p>
<p>$syurui=$namae;<br />
# 管理者へメール送信<br />
if ($send eq "on") { &mymail }</p>
<p>} # end of check</p>
<p>#############################################<br />
# #<br />
# 管理者へのメール送信ルーチン # <br />
# #<br />
#############################################</p>
<p>sub mymail {<br />
# 改行コードを戻す<br />
$naiyo =~ s/&k/\n/g;</p>
<p>$message = <<EOM;<br />
Subject: 掲示板記入連絡<br />
Reply-To: $myaddress</p>
<p>掲示板2への書き込みがありました。</p>
<p>宛先 : $namae</p>
<p>メッセージ</p>
<p>$naiyo</p>
<p>差出人 : $sasidasi</p>
<p>訂正削除パスワード : $pwd1</p>
<p>登録日時 : $nichiji<br />
EOM</p>
<p># メール送信はJISと決められている<br />
&jcode'convert(*message,'jis');</p>
<p>open(MAIL,"|$sendmail $myaddress");<br />
print MAIL $message;<br />
close(MAIL);<br />
} # end of mymail<br />
#############################################<br />
# #<br />
# フォーム入力データセットルーチン # <br />
# #<br />
#############################################<br />
sub form_data {<br />
$nichiji=$in{'nichiji'};<br />
$namae=$in{'namae'};<br />
$naiyo=$in{'naiyo'};</p>
<p># メッセージの改行のみをカットする<br />
@chk = split(/\n/,$naiyo);<br />
$msg="";<br />
foreach (@chk) {<br />
if (length($_) > 1) {<br />
$msg=$msg.$_."\n";<br />
} # end of if<br />
} # end of foreach<br />
$naiyo=$msg;</p>
<p>$naiyo=~ s/\015\012/\n/g;<br />
$naiyo=~ s/\015/\n/g;<br />
$naiyo =~ s/\n/&k/g;<br />
# 文字数チェック<br />
if (length($naiyo) > $mojisu) { $naiyo = substr($naiyo,0,$mojisu); }</p>
<p>$sasidasi=$in{'sasidasi'};<br />
$pwd1=$in{'pwd1'};<br />
$symd=$in{'symd'};</p>
<p># タグの無効化<br />
$ckdt=$namae ; &tagck ; $namae=$ckdt;<br />
# 宛先をセットする<br />
$syurui=$namae;<br />
$ckdt=$naiyo ; &tagck ; $naiyo=$ckdt;<br />
$ckdt=$sasidasi ; &tagck ; $sasidasi=$ckdt;<br />
$ckdt=$pwd1 ; &tagck ; $pwd1=$ckdt;<br />
$ckdt=$symd ; &tagck ; $symd=$ckdt;</p>
<p>} # end of form_data</p>
<p>###############################<br />
# タグの無効化サブルーチン<br />
###############################<br />
sub tagck {<br />
$ckdt =~ s/</&lt;/ig;<br />
$ckdt =~ s/>/&gt;/ig;<br />
$ckdt =~ s/<!--.*-->//ig;<br />
$ckdt =~ s/\,//g;</p>
<p>}</p>
<p>##########################################<br />
# #<br />
# 次ページ表示処理 #<br />
# #<br />
##########################################</p>
<p>sub next {<br />
$in{'page'}++;<br />
&main;<br />
} # end of sub</p>
<p>##########################################<br />
# #<br />
# 前ページ表示処理 #<br />
# #<br />
##########################################</p>
<p>sub back {<br />
if ($page > 1) { $in{'page'}--; }<br />
&main;<br />
} # end of sub<br />
##########################################<br />
# #<br />
# 表示順序の変更指示 #<br />
# #<br />
##########################################<br />
sub narabi {<br />
if ($in{'sortkb'} == 0) { $in{'sortkb'} = 1; }<br />
else { $in{'sortkb'} = 0; }<br />
&main;<br />
} # end of sub</p>
<p>#####################<br />
# ファイル登録<br />
#####################<br />
sub update {</p>
<p># 1 2 3 4 5 6<br />
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード<br />
$value = "$nichiji\t$namae\t$naiyo\t$sasidasi\t$symd\t$pwd1\n";<br />
$pwd1=$in{'pwd1'};</p>
<p># 登録済みデータを読み配列にセットする<br />
if ($pwd1 ne "subetekesu") { &read3; unshift(@data,$value);}<br />
else {push(@data,$value);}</p>
<p># 表示期限を過ぎたデータを消す<br />
%new=();<br />
foreach(@data) {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_);<br />
# 消去日が本日を過ぎていたら除外する<br />
if ($dt5 == 0 || $dt5 >= $ymd) { push(@new,$_);}<br />
} # end of foreach</p>
<p># 掲示板は先頭から古い順になっているのでそのまま1番目のデータをシフトする<br /><a href="mailto:$a=@new">$a=@new</a>;<br />
if ($a > $max) {<br />
$herasu=$a - $max;<br />
for ($i=1; $i<=$herasu; $i++) { pop(@new) }<br />
} # end of if</p>
<p># ファイル登録<br />
if (!open(WRITE,">$file")) { &error(0); }<br />
flock(WRITE,2);<br />
print WRITE @new;<br />
flock(WRITE,8);<br />
close (WRITE);</p>
<p>} # end of update</p>
<p>#############################################<br />
# #<br />
# チェックエラー表示画面ルーチン # <br />
# #<br />
#############################################</p>
<p>sub error {</p>
<p># &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。</p>
<p>$error = $_[0];</p>
<p>if ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; }</p>
<p>elsif ($error eq "2") { $error_msg = '宛名がありません'; }</p>
<p>elsif ($error eq "3") { $error_msg = '差出人は必ず入力してください'; }</p>
<p>elsif ($error eq "91") { $error_msg =
'訂正パスワードが最初の登録時入力してありませんので、訂正/削除はできません。'; }</p>
<p>elsif ($error eq "92") { $error_msg =
'訂正パスワードが最初の登録時のものと不一致のため、訂正/削除はできません。'; }<br />
<br />
print "Content-type: text/html\n\n";</p>
<p>print '<html><head><title>掲示板</title></head>'
. "\n";<br />
print '<body bgcolor="#ff66ff" text="#000000" LINK="#0000ff" VLINK="#ff8888"
ALINK="#FF0000">' . "\n";<br />
print '<h2>掲示板の入力で下記のエラーが発生しました</h2>' . "\n";<br />
print '<BR><BR>';<br />
print "<i>$error_msg</i>\n";</p>
<p># リロードでもどると入力データが消えてしまうので<br />
print 'ブラウザ画面の戻るをクリックする'."\n";;<br />
print '</body></html>' . "\n";<br />
# サブルーチンからプログラムを抜けるので<br />
exit;<br />
}</p>
<p>#############################################<br />
# #<br />
# 明細データの訂正・削除ルーチン # <br />
# #<br />
############################################# </p>
<p>sub meisai {</p>
<p>&read2;<br />
# キー<br />
$keyno=$in{'keyno'};<br />
# 配列番号(次前データ移動用)<br />
$tbno=$in{'tbno'};<br />
# 実配列番号は-1<br />
$tbno--;</p>
<p># 項目分解処理<br />
$bundt=$idxdt{$keyno};<br />
&bunkai;</p>
<p>&meisai_display;</p>
<p>} # end of meisai<br />
#############################################<br />
# #<br />
# 明細データの訂正・削除ルーチン # <br />
# (次前データ処理用) #<br />
############################################# <br />
sub meisai2 {</p>
<p>&read;</p>
<p># 項目分解処理<br />
$bundt=$data[$tbno];<br />
&bunkai;<br />
# キー<br />
$keyno=$dt1;</p>
<p>&meisai_display;</p>
<p>} # end of meisai2<br />
#############################################<br />
# #<br />
# 明細データの共通表示ルーチン # <br />
# #<br />
############################################# <br />
sub meisai_display {<br />
# 明細表示データ№は配列№+1<br />
$mno=$tbno+1;</p>
<p>print "Content-type: text/html\n\n";<br />
print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板の詳細</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
<H2>掲示板の詳細</H2><br />
EOM</p>
<p>print '<form method="post" action="' . $reload . '">' . "\n";<br />
# 外側の飾り線<br />
print '<TABLE BORDER="10" CELLPADDING="10" WIDTH="100%">';<br />
print '<TR>';</p>
<p>print '宛先 <input type=text name="namae" size="40" MAXLENGTH="40"
value="'.$dt2.'"><br>' . "\n";<br />
print '<BR>';</p>
<p>print 'メッセージをどうぞ';<br />
print '<BR>';<br />
print '<TEXTAREA NAME="naiyo" COLS=70 ROWS=5>'.$dt3.'</TEXTAREA>' .
"\n";<br />
print '<BR><BR>';</p>
<p>print '差出人 <input type=text name="sasidasi" size="40" MAXLENGTH="40"
value="'.$dt4.'"><br>' . "\n";<br />
print '<BR>';</p>
<p>print '表示期限 <input type=text name="symd" size="10" MAXLENGTH="10"
value="'.$dt5.'"><br>' . "\n";<br />
print '<BR>';</p>
<p># パスワードが設定してあれば変更可能<br />
# 最終項目なので改行コードがあるのでカットして比較する<br />
$dt6=~s/\n//g;<br />
if ($dt6 ne "") {<br />
print '訂正削除パスワード <input type=text name="pwd1" size="10" MAXLENGTH="10">'
. "\n";<br />
print '<BR>';<br />
print '<FONT COLOR=#AA0000>';<br />
print '*訂正又は削除する場合に必要です。未設定時は訂正削除不可';<br />
print '</FONT>';<br />
print '<BR>';<br />
# 訂正か削除か選択する<br />
print '<TABLE BGCOLOR="#ffffCC">';<br />
print '<TR><TD>';<br />
print '<input type="radio" name="syori" value ="0" checked>訂正削除なし' .
"\n";<br />
print '</TD><TD> </TD><TD>';<br />
print '<input type="radio" name="syori" value ="1">訂正します' . "\n";<br />
print '</TD><TD> </TD><TD>';<br />
print '<input type="radio" name="syori" value ="2">削除します' . "\n";<br />
print '</TD><TD> </TD><TD>';<br />
print '<input type=hidden name="action" value="teisei">'."\n";<br />
print '<input type=hidden name="keyno" value="'.$keyno.'">'."\n";<br />
$syurui_sv=$dt1;<br />
&hidpara;</p>
<p>print '<input type=submit value="訂正削除の実行">' . "\n";<br />
print '</TD></TR></TABLE>'."\n";<br />
print '</FORM>'. "\n";<br />
print '<BR>';<br />
# キーの確認表示<br />
if ($test eq "on") { print
"<right><i>($keyno)</i></right>\n"; }</p>
<p>} # end of if</p>
<p>############################</p>
<p># 戻る<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="main">' . "\n";<br />
$syurui_sv=$dt1;<br />
&hidpara;<br />
print '<input type=submit value="戻る">' . "\n";<br />
print '</FORM>'. "\n";<br />
print '<BR>';<br />
# 外側の飾り線<br />
print '</TR></TABLE>';</p>
<p>print '</BODY></HTML>'. "\n";<br />
} # end of meisai</p>
<p>#####################<br />
# データ訂正<br />
#####################<br />
sub teisei {<br />
# 訂正削除なしの場合<br />
if (($in{'action'} eq 'teisei') && ($in{'syori'} == 0)) { return }<br />
# 入力項目チェック<br />
# フォーム入力データ<br />
&form_data;</p>
<p># 宛名がない場合<br />
if ($namae eq "" ) { &error(2); }<br />
# 差出人がない場合<br />
if ($sasidasi eq "" ) { &error(3); }</p>
<p># チェック通過、更新へ</p>
<p>$syurui=$namae;<br />
# 管理者へメール送信<br />
if ($send eq "on") { &mymail }</p>
<p>&read2;<br />
# キー<br />
$keyno=$in{'keyno'};<br />
# 管理者用強制パスワード<br />
if ($pwd1 ne "nopassword") {<br />
# 訂正パスワードチェック<br />
$bundt=$idxdt{$keyno};<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$bundt);</p>
<p>#登録パスワードの改行コードをカットしたものと比較する (98.7.11)<br />
$pck=$dt6;<br />
$pck=~s/\n//g;</p>
<p>if ($pck eq "") { &error(91) }<br />
if ($pck ne $pwd1) { &error(92) }<br />
} # end of if<br />
########################</p>
<p># 削除の場合<br />
if (($in{'action'} eq 'teisei') && ($in{'syori'} == 2)) { &sakujo;
return }</p>
<p># ここからは訂正選択時処理</p>
<p># データ訂正<br />
# 1 2 3 4 5 6<br />
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード<br />
$value = "$keyno\t$namae\t$naiyo\t$sasidasi\t$symd\t$pwd1\n";<br />
$idxdt{$keyno}=$value;<br />
&file_write;<br />
} # end of teisei</p>
<p>#####################<br />
# データ削除<br />
#####################<br />
sub sakujo {</p>
<p># データ削除<br />
delete $idxdt{$keyno};<br />
&file_write;<br />
} # end of sakujo</p>
<p><br />
##########################<br />
# ファイル登録共通処理 #<br />
##########################<br />
sub file_write {</p>
<p># 登録用配列にデータセット<br />
%new=();</p>
<p># 配列データを降順にソートする(keysでは登録順に値が返されるとは限らないため)<br />
@data=sort by_date keys(%idxdt);</p>
<p>foreach (@data){<br />
# 通常では発生しないが開発途中での空のデータを除く(10は適当)<br />
if (length($idxdt{$_}) > 10) {<br />
push(@new,$idxdt{$_});}<br />
} # end of foreach</p>
<p># ファイル登録<br />
if (!open(WRITE,">$file")) { &error(0); }<br />
flock(WRITE,2);<br />
print WRITE @new;<br />
flock(WRITE,8);<br />
close (WRITE);</p>
<p>} # end of write<br />
####################################<br />
# #<br />
# キー(日付)を降順ソートする #<br />
# #<br />
####################################<br />
sub by_date { $b cmp $a }</p>
<p>################ end of script ###################</p>
<p><br /><br /><br />
#!/usr/local/bin/perl</p>
<p># 掲示板2(フレームを利用したパターン)右画面</p>
<p># id=bbs2.cgi</p>
<p># update. 01.9.16</p>
<p># 使用上の注意・・・漢字コードの変換が不完全ですので文字化けするおそれがあります。<br />
# そのつもりでお使い下さい。</p>
<p># 日本語コード変換ライブラリ(v2.0)の指定<br />
# &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される </p>
<p>require 'cgi-lib.pl';<br />
require 'jcode.pl';<br />
&ReadParse;</p>
<p># 設置するURLを設定<br />
$reload = 'http://xxx/bbs2.cgi';</p>
<p>$file = "/cgi/bbs2.dat";<br />
$sendmail = '/usr/lib/sendmail';</p>
<p># 掲示板へ記入したら管理者へメール通知するならON<br />
$send="off";<br />
# メールの送り先<br />
$myaddress =<a href="mailto:">' oooooo@xxx.co.jp'</a>;</p>
<p># データ確認デバッグモード(通常は$test=""、各画面で変数状態を見たいときは"on")<br />
$test="";</p>
<p># 最大登録数<br />
$max=200;<br />
# メッセージの文字数制限(この値の半分が漢字数)<br />
$mojisu = 200;<br />
# 表示期間の設定(設定した日数後のファイル更新時に消去します、消去しない場合は0)<br />
$syokyo=7; # 1週間後</p>
<p># 1画面表示件数<br />
$gyosu=10 ;</p>
<p>####################################<br />
# #<br />
# メインルーチン(処理の分岐) #<br />
# #<br />
####################################</p>
<p># 消去日計算<br />
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime(time);<br />
$mm++;<br />
# 2桁化<br />
$mm = sprintf("%.2d",$mm);<br />
$dd = sprintf("%.2d",$dd);<br />
# 西暦4桁処理<br />
if ($yy < 70) { $yy = $yy + 2000;}<br />
else { $yy = $yy + 1900;}<br />
# 本日<br />
$ymd=$yy.$mm.$dd;</p>
<p><br />
$page=$in{'page'};<br />
$syurui=$in{'syurui'};<br />
# 最初に渡された状態セーブ<br />
$syurui_sv=$syurui;</p>
<p># 該当データを調べる<br />
if ($syurui ne "all") { &read4 }</p>
<p># 全体の流れを決定する<br />
if ($in{'action'} eq 'main') { &main; }</p>
<p>elsif ($in{'action'} eq 'kinyu') { &kinyu; }</p>
<p>elsif ($in{'action'} eq 'check') { &check; &main; }</p>
<p>elsif ($in{'action'} eq 'meisai') { &meisai; }</p>
<p>elsif ($in{'action'} eq 'next') { &next; }</p>
<p>elsif ($in{'action'} eq 'back') { &back; }</p>
<p>elsif ($in{'action'} eq 'narabi') { &narabi; }<br />
# メール送信画面<br />
elsif ($in{'action'} eq 'email') { &email; }</p>
<p># 詳細表示画面<br />
elsif ($in{'action'} eq 'teisei') {&teisei;&main; }</p>
<p>else { &first; }</p>
<p># なくても良いが最終出口を示す<br />
exit;</p>
<p>#############################################<br />
# #<br />
# データを読む # <br />
# #<br />
############################################# </p>
<p>sub read {</p>
<p># データを読み各連想配列に加算する<br />
# 1 2 3 4 5 6<br />
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード<br />
$j=0;<br />
# 配列の初期化<br />
@data=();</p>
<p>open(DB,"$file");<br />
flock(DB,2);<br />
while (<DB>) {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_); </p>
<p># とりあえずキーがないデータを表示しないため<br />
if ($dt1 ne "") {</p>
<p><br />
# 表示期限チェック<br />
if ($dt5 > 0 && $dt5 >= $ymd) {<br />
# 9は全部、他は指定分類のみ、指定なしも全件<br />
if ($syurui eq "all") { $data[$j]=$_ ;$j++}<br />
elsif ($syurui eq $dt2) { $data[$j]=$_ ;$j++}<br />
} # end of if</p>
<p>} # とりあえずここまで</p>
<p>} # end of while</p>
<p>flock(DB,8);<br />
close(DB);<br />
# データ数<br /><a href="mailto:$cnt=@data">$cnt=@data</a>;</p>
<p>} # end of read<br />
#############################################<br />
# #<br />
# 登録データを読む(訂正削除用配列) # <br />
# #<br />
############################################# </p>
<p>sub read2 {</p>
<p># データを読み各連想配列に加算する<br />
open(DB,"$file");<br />
flock(DB,2);<br />
@data=<DB>;<br />
flock(DB,8);<br />
close(DB);</p>
<p># データ数<br /><a href="mailto:$cnt=@data">$cnt=@data</a>;<br />
# 配列の初期化<br />
%idxdt=();</p>
<p># 各レコードを日時をキーにした連想配列にセットする<br />
foreach (@data) {<br />
($idx,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_); </p>
<p># キーを変数名に入れて1レコード全体をセットする<br />
$idxdt{$idx} = $_;<br />
} # end of foreach</p>
<p>} # end of read2<br />
#############################################<br />
# #<br />
# データを読む(全件) # <br />
# #<br />
############################################# </p>
<p>sub read3 {<br />
open(DB,"$file");<br />
flock(DB,2);<br />
@data=<DB>;<br />
flock(DB,8);<br />
close(DB);<br />
} # end of read3</p>
<p><br />
#############################################<br />
# <br />
# アンカータグで渡されたキーデータから該当内容を調べる <br />
# <br />
############################################# </p>
<p>sub read4 {</p>
<p>open(DB,"$file");<br />
flock(DB,2);</p>
<p>while (<DB>) {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_); <br />
# 指定レコードキーがあったらそのレコードの宛先をセットする<br />
if ($syurui == $dt1) { $syurui=$dt2 ;last ; }</p>
<p>} # end of while</p>
<p>flock(DB,8);<br />
close(DB);</p>
<p>} # end of read4<br />
########################<br />
# #<br />
# 項目分解ルーチン #<br />
# #<br />
########################<br />
sub bunkai {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$bundt);</p>
<p># 日付時刻分解<br />
$yy=substr($dt1,0,4);<br />
$mm=substr($dt1,4,2);<br />
$dd=substr($dt1,6,2);<br />
$ji=substr($dt1,8,2);<br />
$fun=substr($dt1,10,2);<br />
$byo=substr($dt1,12,2);<br />
$nichiji=$yy.$mm.$dd.$ji.$fun.$byo;<br />
$hizuke="$yy年$mm月$dd日$ji時$fun分";<br />
$hizuke1="$yy年$mm月$dd日";<br />
$hizuke2="$ji時$fun分";<br />
# 番号</p>
<p># 内容の改行を元に戻す<br />
$dt3 =~ s/&k/\n/g;<br />
# 表示用に変換する<br />
$naiyo2 = $dt3;<br />
$naiyo2 =~ s/\n/<BR>/g;</p>
<p>} # end of bunkai</p>
<p>#############################################<br />
# #<br />
# 最初に処理するルーチン # <br />
# #<br />
############################################# </p>
<p>sub first {</p>
<p>print "Content-type: text/html\n\n";</p>
<p>print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板2</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
EOM</p>
<p>print '<BR><BR><FONT size=5 color="blue">';<br />
print
'<CENTER>左側から表示させる内容を選択してください</CENTER></FONT>'."\n";<br />
print '<BR><BR>'."\n";<br />
$page=1;<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="kinyu">' . "\n";<br />
print '<input type=submit value=" 記入画面へ ">' . "\n";<br />
&hidpara;<br />
print '</FORM>';</p>
<p>print '</BODY></HTML>'. "\n";</p>
<p>} # end of first</p>
<p>#############################################<br />
# #<br />
# メイン処理画面を表示する # <br />
# #<br />
############################################# </p>
<p>sub main {</p>
<p># 表示用変数<br />
$page = $in{'page'};<br />
$sortkb = $in{'sortkb'} ;</p>
<p>&read;</p>
<p># 昇順にする<br />
if ($sortkb == 1) { @data=reverse(@data);}<br />
# ページ数計算<br />
$page_max = (($cnt-1) / $gyosu) + 1;<br />
# 整数部をとりだす<br />
($page_max,$dummy)=split(/\./,$page_max);</p>
<p># 表示出力処理<br />
print "Content-type: text/html\n\n";<br />
print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板2</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
EOM</p>
<p>print '<TABLE BORDER="1">';<br />
print '<TR><TD>';<br />
print '<FONT SIZE=3 COLOR=#0000FF>'."\n";<br />
print '掲示板2'."\n";<br />
print '</FONT></TD>';<br />
print '<TD>指定データ</TD>';</p>
<p>print "<TH>該当件数</TH><TH><FONT
COLOR=#0000FF>表示頁</FONT></TH><TH>最終頁</TH></TR>\n";</p>
<p>print '<TR VALIGN="MIDDLE"><TD ALIGN="CENTER">';<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="kinyu">' . "\n";<br />
print '<input type=submit value=" 記入画面へ ">' . "\n";<br />
&hidpara;<br />
print '</FORM>';<br />
print '</TD>';<br />
if ($syurui eq "all") { $sitei="全件" } else { $sitei=$syurui }<br />
print "<TD ALIGN=\"CENTER\"><FONT
COLOR=#AA0000>$sitei</FONT></TD>\n";</p>
<p>print "<TD ALIGN=\"right\"><FONT
COLOR=#AA0000>$cnt</FONT></TD><TD ALIGN=\"right\"><FONT
COLOR=#0000FF>$page</FONT></TD>\n";<br />
print "<TD ALIGN=\"right\"><FONT
COLOR=#AA0000>$page_max</FONT></TD>\n";<br />
print '</TR></TABLE>'."\n";</p>
<p># 前頁表示</p>
<p># ボタンを並べる<br />
# 上段<br />
print '<TABLE BGCOLOR="#ffffCC">';<br />
print '<TR VALIGN="BOTTOM">';<br />
# 表示順序<br />
print '<TD>';<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="narabi">' . "\n";<br />
&hidpara;<br />
if ($sortkb == 0) { $sortkbn = "日付の古いものを先に"; }<br />
else { $sortkbn = "日付の新しいものを先に"; }<br />
print '<input type=submit value="'.$sortkbn.'">' . "\n";<br />
print '</FORM>'. "\n";<br />
print '</TD>';<br />
print '<TD> </TD>';<br />
# 前頁表示<br />
print '<TD>';<br />
if ($page == 1) { print ' '; }<br />
else {<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="back">' . "\n";<br />
&hidpara;<br />
print '<input type=submit value="前頁">' . "\n";<br />
print '</FORM>';<br />
} # end of if</p>
<p>print '</TD>';<br />
print '<TD> </TD>';<br />
# 次頁表示<br />
print '<TD>';<br />
if ($page == $page_max) { print ' '; }<br />
else {<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="next">' . "\n";<br />
&hidpara;<br />
print '<input type=submit value="次頁">' . "\n";<br />
print '</FORM>'. "\n";<br />
} # end of if<br />
print '</TD>';<br />
print '<TD> </TD>';</p>
<p>print '</TR></TABLE>'."\n";<br />
print '</FORM>'. "\n";</p>
<p># 該当データが0件の場合<br />
if ($cnt == 0) {<br />
print '<BR><BR><FONT size=5 color="blue">';<br />
print
'<CENTER>該当データは0件です、選択内容を変えてご覧ください</CENTER></FONT>'."\n";<br />
return } # end of if</p>
<p># 最初は詳細形式を表示する<br />
&disp3;</p>
<p>} # end of main</p>
<p>#################################<br />
# hiddenパラメータ共通項目 #<br />
#################################<br />
sub hidpara {<br />
print '<input type=hidden name="page" value="'.$page.'">'."\n";<br />
print '<input type=hidden name="sortkb" value="'.$in{'sortkb'}.'">' .
"\n";<br />
print '<input type=hidden name="syurui" value="'.$syurui_sv.'">' .
"\n";<br />
} # end of hidpara</p>
<p>##########################<br />
# #<br />
# 詳細表示ルーチン #<br />
# #<br />
##########################<br />
sub disp3 {</p>
<p>print "<TABLE BORDER=\"1\" WIDTH=\"100%\" >\n";<br />
print
"<TR><TH>№</TH><TH>宛先</TH><TH>日付</TH><TH>内 容</TH><TH>差出人</TH></TR>\n";</p>
<p># 行数分だけ繰り返す<br />
for($i=1; $i<=$gyosu; $i++) {</p>
<p>#print '<TR>';<br />
# 1列目はページカウンタ*行数+$i</p>
<p>$lno=$gyosu * ($page - 1) + $i;<br />
$no=$lno-1;</p>
<p># 項目分解処理<br />
$bundt=$data[$no];<br />
&bunkai;</p>
<p># 分類別色<br />
$iro=$buncol[$bunrui];</p>
<p>print '<TR>';<br />
print '<TD ALIGN="right"><FONT
COLOR='.$iro.'>'.$lno.'</FONT>'."\n";<br />
if ($test eq "on") { print '<BR>'.$bundt.''."\n"; } # テスト表示<br />
print '</TD>'."\n";<br />
print '<TD ALIGN="left" NOWRAP><FONT
COLOR='.$iro.'>'.$dt2.'</FONT></TD>';<br />
print '<TD ALIGN="left" NOWRAP><FONT
COLOR='.$iro.'>'.$hizuke1.'<BR>'.$hizuke2.'</FONT></TD>';<br />
print '<TD ALIGN="left"><FONT COLOR='.$iro.'>';<br />
$act="meisai";<br />
print '<A HREF =
"'.$reload.'?action='.$act.'&keyno='.$dt1.'&tbno='.$lno.'&page='.$page.'&sortkb='.$sortkb.'">'.$naiyo2.'</A>';<br />
print '</FONT><BR>'."\n";<br />
print '</TD>'."\n";<br />
print '<TD ALIGN="left"><FONT
COLOR='.$iro.'>'.$dt4.'</FONT></TD>'."\n";<br />
print '</TD>'."\n";<br />
#print '<TD ALIGN="left"><FONT
COLOR='.$iro.'>'.$dt5.'</FONT></TD>'."\n";<br />
#print '</TD>'."\n";<br />
#print '<TD ALIGN="left"><FONT
COLOR='.$iro.'>'.$dt6.'</FONT></TD>'."\n";<br />
print '</TR>'."\n";</p>
<p># 最終データを表示したら抜ける<br />
if ($lno >= $cnt) { last }</p>
<p>} # end of for</p>
<p>print '</TABLE>';<br />
print "</BODY></HTML>\n";</p>
<p>} # end of disp3</p>
<p><br />
#############################################<br />
# #<br />
# 掲示板新規記入処理 # <br />
# #<br />
############################################# </p>
<p>sub kinyu {<br />
# 消去日が設定してある場合<br />
if ($syokyo > 0) {<br />
# 消去日計算<br />
$syokyobyo = $syokyo * 60 * 60 * 24;<br />
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime(time + $syokyobyo);<br />
$mm++;<br />
# 2桁化<br />
$mm = sprintf("%.2d",$mm);<br />
$dd = sprintf("%.2d",$dd);<br />
$ji = sprintf("%.2d",$ji);<br />
$fun = sprintf("%.2d",$fun);<br />
$byo = sprintf("%.2d",$byo);<br />
# 西暦4桁処理<br />
if ($yy < 70) { $yy = $yy + 2000;}<br />
else { $yy = $yy + 1900;}<br />
# 消去日<br />
$symd=$yy.$mm.$dd;<br />
} # end of if<br />
else { $symd=0 } # end of else</p>
<p>print "Content-type: text/html\n\n";</p>
<p>print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板への記入</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
<H2>掲示板への記入</H2><br />
EOM</p>
<p># 外側の飾り線(画面の設定によってはわくとして表示しないことがある)<br />
print '<TABLE BORDER="10" CELLPADDING="10" WIDTH="100%">';<br />
print '<TR>';</p>
<p>print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="check">' . "\n";<br />
# 左画面から指定された宛先があれば表示させる<br />
if ($syurui eq "all") { $atesaki = "" } else { $atesaki = $syurui }<br />
print '宛先 <input type=text name="namae" size="40" MAXLENGTH="40"
value="'.$atesaki.'"><br>'."\n";<br />
print '<BR>';<br />
print 'メッセージをどうぞ(漢字の場合100文字以内)';<br />
print '<BR>';<br />
print '<TEXTAREA NAME="naiyo" COLS=70 ROWS=5></TEXTAREA>' .
"\n";<br />
print '<BR><BR>';</p>
<p>print '差出人 <input type=text name="sasidasi" size="40" MAXLENGTH="40">'
. "\n";<br />
print '<BR><BR>';</p>
<p>print '<FONT COLOR=#AA0000>';<br />
print '登録後にあなたが訂正削除する場合に必要。未設定時は訂正削除不可';<br />
print '</FONT>';<br />
print '<BR>';<br />
print '訂正削除パスワード <input type=text name="pwd1" size="10" MAXLENGTH="10">'
. "\n";<br />
print '<BR><BR>';</p>
<p>print '<FONT COLOR=#AA0000>';<br />
print "表示期限は本日より $syokyo日間です、要変更の場合は訂正して下さい\n";<br />
print '<BR>';<br />
print '</FONT>';<br />
print '表示期限 <input type=text name="symd" size="10" MAXLENGTH="10"
value="'.$symd.'">' . "\n";<br />
print '<BR>';<br />
print '<TABLE BGCOLOR="#ffffCC">';<br />
print '<TR VALIGN="BOTTOM">';<br />
# 表示順序<br />
print '<TD>';<br />
print '<input type=submit value="登録">' . "\n";<br />
print '</TD>';<br />
print '<TD> </TD>';<br />
print '<TD>';<br />
print '<input type=reset value="入力内容取消">' . "\n";</p>
<p># 登録日時セット<br />
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime;<br />
$mm++;<br />
# 2桁化<br />
$mm = sprintf("%.2d",$mm);<br />
$dd = sprintf("%.2d",$dd);<br />
$ji = sprintf("%.2d",$ji);<br />
$fun = sprintf("%.2d",$fun);<br />
$byo = sprintf("%.2d",$byo);<br />
# 西暦4桁処理<br />
if ($yy < 70) { $yy = $yy + 2000;}<br />
else { $yy = $yy + 1900;}<br />
# 登録日時<br />
$nichiji=$yy.$mm.$dd.$ji.$fun.$byo;</p>
<p># ここで同時刻に登録しようとした場合を考えてキーをユニーク(唯一)にするため<br />
# 日時の後に4桁のランダム数字を足す(これでも同一になった場合は訂正時1つのデータ消滅する)<br />
srand;<br />
$a=rand;<br />
$no4=substr($a,index($a,".")+1,4);<br />
if ($no4 == 0) { $no4 = "0000"; }<br />
$nichiji.=$no4;<br />
print '<input type=hidden name="nichiji" value="'.$nichiji.'">' .
"\n";</p>
<p># 共通データ渡し<br />
$syurui_sv=$nichiji;<br />
&hidpara;<br />
print '</FORM>'. "\n";<br />
print '</TD>';<br />
print '<TD> </TD>';<br />
print '<TD>';<br />
# 戻る<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="main">' . "\n";<br />
print '<input type=submit value="記入せずに戻る">' . "\n";</p>
<p># 最初の画面から来たときは何も指定データがないから<br />
if ($syurui eq "") { $syurui="all" }<br />
$syurui_sv=$syurui;<br />
&hidpara;<br />
print '</TD></TR></TABLE>'."\n";</p>
<p><br />
print '</FORM>'. "\n";</p>
<p># 外側の飾り線<br />
print '</TR></TABLE>';</p>
<p>print '</BODY></HTML>'. "\n";<br />
} # end of kinyu</p>
<p>##########################################<br />
# #<br />
# 入力されたデータのチェックルーチン #<br />
# #<br />
##########################################</p>
<p>sub check {</p>
<p>&form_data;</p>
<p># 宛名がない場合<br />
if ($namae eq "" ) { &error(2); }<br />
# 差出人がない場合<br />
if ($sasidasi eq "" ) { &error(3); }</p>
<p># チェック通過、更新へ<br />
&update;</p>
<p>$syurui=$namae;<br />
# 管理者へメール送信<br />
if ($send eq "on") { &mymail }</p>
<p>} # end of check</p>
<p>#############################################<br />
# #<br />
# 管理者へのメール送信ルーチン # <br />
# #<br />
#############################################</p>
<p>sub mymail {<br />
# 改行コードを戻す<br />
$naiyo =~ s/&k/\n/g;</p>
<p>$message = <<EOM;<br />
Subject: 掲示板記入連絡<br />
Reply-To: $myaddress</p>
<p>掲示板2への書き込みがありました。</p>
<p>宛先 : $namae</p>
<p>メッセージ</p>
<p>$naiyo</p>
<p>差出人 : $sasidasi</p>
<p>訂正削除パスワード : $pwd1</p>
<p>登録日時 : $nichiji<br />
EOM</p>
<p># メール送信はJISと決められている<br />
&jcode'convert(*message,'jis');</p>
<p>open(MAIL,"|$sendmail $myaddress");<br />
print MAIL $message;<br />
close(MAIL);<br />
} # end of mymail<br />
#############################################<br />
# #<br />
# フォーム入力データセットルーチン # <br />
# #<br />
#############################################<br />
sub form_data {<br />
$nichiji=$in{'nichiji'};<br />
$namae=$in{'namae'};<br />
$naiyo=$in{'naiyo'};</p>
<p># メッセージの改行のみをカットする<br />
@chk = split(/\n/,$naiyo);<br />
$msg="";<br />
foreach (@chk) {<br />
if (length($_) > 1) {<br />
$msg=$msg.$_."\n";<br />
} # end of if<br />
} # end of foreach<br />
$naiyo=$msg;</p>
<p>$naiyo=~ s/\015\012/\n/g;<br />
$naiyo=~ s/\015/\n/g;<br />
$naiyo =~ s/\n/&k/g;<br />
# 文字数チェック<br />
if (length($naiyo) > $mojisu) { $naiyo = substr($naiyo,0,$mojisu); }</p>
<p>$sasidasi=$in{'sasidasi'};<br />
$pwd1=$in{'pwd1'};<br />
$symd=$in{'symd'};</p>
<p># タグの無効化<br />
$ckdt=$namae ; &tagck ; $namae=$ckdt;<br />
# 宛先をセットする<br />
$syurui=$namae;<br />
$ckdt=$naiyo ; &tagck ; $naiyo=$ckdt;<br />
$ckdt=$sasidasi ; &tagck ; $sasidasi=$ckdt;<br />
$ckdt=$pwd1 ; &tagck ; $pwd1=$ckdt;<br />
$ckdt=$symd ; &tagck ; $symd=$ckdt;</p>
<p>} # end of form_data</p>
<p>###############################<br />
# タグの無効化サブルーチン<br />
###############################<br />
sub tagck {<br />
$ckdt =~ s/</&lt;/ig;<br />
$ckdt =~ s/>/&gt;/ig;<br />
$ckdt =~ s/<!--.*-->//ig;<br />
$ckdt =~ s/\,//g;</p>
<p>}</p>
<p>##########################################<br />
# #<br />
# 次ページ表示処理 #<br />
# #<br />
##########################################</p>
<p>sub next {<br />
$in{'page'}++;<br />
&main;<br />
} # end of sub</p>
<p>##########################################<br />
# #<br />
# 前ページ表示処理 #<br />
# #<br />
##########################################</p>
<p>sub back {<br />
if ($page > 1) { $in{'page'}--; }<br />
&main;<br />
} # end of sub<br />
##########################################<br />
# #<br />
# 表示順序の変更指示 #<br />
# #<br />
##########################################<br />
sub narabi {<br />
if ($in{'sortkb'} == 0) { $in{'sortkb'} = 1; }<br />
else { $in{'sortkb'} = 0; }<br />
&main;<br />
} # end of sub</p>
<p>#####################<br />
# ファイル登録<br />
#####################<br />
sub update {</p>
<p># 1 2 3 4 5 6<br />
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード<br />
$value = "$nichiji\t$namae\t$naiyo\t$sasidasi\t$symd\t$pwd1\n";<br />
$pwd1=$in{'pwd1'};</p>
<p># 登録済みデータを読み配列にセットする<br />
if ($pwd1 ne "subetekesu") { &read3; unshift(@data,$value);}<br />
else {push(@data,$value);}</p>
<p># 表示期限を過ぎたデータを消す<br />
%new=();<br />
foreach(@data) {<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_);<br />
# 消去日が本日を過ぎていたら除外する<br />
if ($dt5 == 0 || $dt5 >= $ymd) { push(@new,$_);}<br />
} # end of foreach</p>
<p># 掲示板は先頭から古い順になっているのでそのまま1番目のデータをシフトする<br /><a href="mailto:$a=@new">$a=@new</a>;<br />
if ($a > $max) {<br />
$herasu=$a - $max;<br />
for ($i=1; $i<=$herasu; $i++) { pop(@new) }<br />
} # end of if</p>
<p># ファイル登録<br />
if (!open(WRITE,">$file")) { &error(0); }<br />
flock(WRITE,2);<br />
print WRITE @new;<br />
flock(WRITE,8);<br />
close (WRITE);</p>
<p>} # end of update</p>
<p>#############################################<br />
# #<br />
# チェックエラー表示画面ルーチン # <br />
# #<br />
#############################################</p>
<p>sub error {</p>
<p># &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。</p>
<p>$error = $_[0];</p>
<p>if ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; }</p>
<p>elsif ($error eq "2") { $error_msg = '宛名がありません'; }</p>
<p>elsif ($error eq "3") { $error_msg = '差出人は必ず入力してください'; }</p>
<p>elsif ($error eq "91") { $error_msg =
'訂正パスワードが最初の登録時入力してありませんので、訂正/削除はできません。'; }</p>
<p>elsif ($error eq "92") { $error_msg =
'訂正パスワードが最初の登録時のものと不一致のため、訂正/削除はできません。'; }<br />
<br />
print "Content-type: text/html\n\n";</p>
<p>print '<html><head><title>掲示板</title></head>'
. "\n";<br />
print '<body bgcolor="#ff66ff" text="#000000" LINK="#0000ff" VLINK="#ff8888"
ALINK="#FF0000">' . "\n";<br />
print '<h2>掲示板の入力で下記のエラーが発生しました</h2>' . "\n";<br />
print '<BR><BR>';<br />
print "<i>$error_msg</i>\n";</p>
<p># リロードでもどると入力データが消えてしまうので<br />
print 'ブラウザ画面の戻るをクリックする'."\n";;<br />
print '</body></html>' . "\n";<br />
# サブルーチンからプログラムを抜けるので<br />
exit;<br />
}</p>
<p>#############################################<br />
# #<br />
# 明細データの訂正・削除ルーチン # <br />
# #<br />
############################################# </p>
<p>sub meisai {</p>
<p>&read2;<br />
# キー<br />
$keyno=$in{'keyno'};<br />
# 配列番号(次前データ移動用)<br />
$tbno=$in{'tbno'};<br />
# 実配列番号は-1<br />
$tbno--;</p>
<p># 項目分解処理<br />
$bundt=$idxdt{$keyno};<br />
&bunkai;</p>
<p>&meisai_display;</p>
<p>} # end of meisai<br />
#############################################<br />
# #<br />
# 明細データの訂正・削除ルーチン # <br />
# (次前データ処理用) #<br />
############################################# <br />
sub meisai2 {</p>
<p>&read;</p>
<p># 項目分解処理<br />
$bundt=$data[$tbno];<br />
&bunkai;<br />
# キー<br />
$keyno=$dt1;</p>
<p>&meisai_display;</p>
<p>} # end of meisai2<br />
#############################################<br />
# #<br />
# 明細データの共通表示ルーチン # <br />
# #<br />
############################################# <br />
sub meisai_display {<br />
# 明細表示データ№は配列№+1<br />
$mno=$tbno+1;</p>
<p>print "Content-type: text/html\n\n";<br />
print <<EOM;<br />
<HTML><br />
<HEAD><TITLE>掲示板の詳細</TITLE></HEAD><br />
<BODY BGCOLOR="#ffffff" BACKGROUND="<a href="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif</a>"><br />
<H2>掲示板の詳細</H2><br />
EOM</p>
<p>print '<form method="post" action="' . $reload . '">' . "\n";<br />
# 外側の飾り線<br />
print '<TABLE BORDER="10" CELLPADDING="10" WIDTH="100%">';<br />
print '<TR>';</p>
<p>print '宛先 <input type=text name="namae" size="40" MAXLENGTH="40"
value="'.$dt2.'"><br>' . "\n";<br />
print '<BR>';</p>
<p>print 'メッセージをどうぞ';<br />
print '<BR>';<br />
print '<TEXTAREA NAME="naiyo" COLS=70 ROWS=5>'.$dt3.'</TEXTAREA>' .
"\n";<br />
print '<BR><BR>';</p>
<p>print '差出人 <input type=text name="sasidasi" size="40" MAXLENGTH="40"
value="'.$dt4.'"><br>' . "\n";<br />
print '<BR>';</p>
<p>print '表示期限 <input type=text name="symd" size="10" MAXLENGTH="10"
value="'.$dt5.'"><br>' . "\n";<br />
print '<BR>';</p>
<p># パスワードが設定してあれば変更可能<br />
# 最終項目なので改行コードがあるのでカットして比較する<br />
$dt6=~s/\n//g;<br />
if ($dt6 ne "") {<br />
print '訂正削除パスワード <input type=text name="pwd1" size="10" MAXLENGTH="10">'
. "\n";<br />
print '<BR>';<br />
print '<FONT COLOR=#AA0000>';<br />
print '*訂正又は削除する場合に必要です。未設定時は訂正削除不可';<br />
print '</FONT>';<br />
print '<BR>';<br />
# 訂正か削除か選択する<br />
print '<TABLE BGCOLOR="#ffffCC">';<br />
print '<TR><TD>';<br />
print '<input type="radio" name="syori" value ="0" checked>訂正削除なし' .
"\n";<br />
print '</TD><TD> </TD><TD>';<br />
print '<input type="radio" name="syori" value ="1">訂正します' . "\n";<br />
print '</TD><TD> </TD><TD>';<br />
print '<input type="radio" name="syori" value ="2">削除します' . "\n";<br />
print '</TD><TD> </TD><TD>';<br />
print '<input type=hidden name="action" value="teisei">'."\n";<br />
print '<input type=hidden name="keyno" value="'.$keyno.'">'."\n";<br />
$syurui_sv=$dt1;<br />
&hidpara;</p>
<p>print '<input type=submit value="訂正削除の実行">' . "\n";<br />
print '</TD></TR></TABLE>'."\n";<br />
print '</FORM>'. "\n";<br />
print '<BR>';<br />
# キーの確認表示<br />
if ($test eq "on") { print
"<right><i>($keyno)</i></right>\n"; }</p>
<p>} # end of if</p>
<p>############################</p>
<p># 戻る<br />
print '<form method="post" action="' . $reload . '">' . "\n";<br />
print '<input type=hidden name="action" value="main">' . "\n";<br />
$syurui_sv=$dt1;<br />
&hidpara;<br />
print '<input type=submit value="戻る">' . "\n";<br />
print '</FORM>'. "\n";<br />
print '<BR>';<br />
# 外側の飾り線<br />
print '</TR></TABLE>';</p>
<p>print '</BODY></HTML>'. "\n";<br />
} # end of meisai</p>
<p>#####################<br />
# データ訂正<br />
#####################<br />
sub teisei {<br />
# 訂正削除なしの場合<br />
if (($in{'action'} eq 'teisei') && ($in{'syori'} == 0)) { return }<br />
# 入力項目チェック<br />
# フォーム入力データ<br />
&form_data;</p>
<p># 宛名がない場合<br />
if ($namae eq "" ) { &error(2); }<br />
# 差出人がない場合<br />
if ($sasidasi eq "" ) { &error(3); }</p>
<p># チェック通過、更新へ</p>
<p>$syurui=$namae;<br />
# 管理者へメール送信<br />
if ($send eq "on") { &mymail }</p>
<p>&read2;<br />
# キー<br />
$keyno=$in{'keyno'};<br />
# 管理者用強制パスワード<br />
if ($pwd1 ne "nopassword") {<br />
# 訂正パスワードチェック<br />
$bundt=$idxdt{$keyno};<br />
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$bundt);</p>
<p>#登録パスワードの改行コードをカットしたものと比較する (98.7.11)<br />
$pck=$dt6;<br />
$pck=~s/\n//g;</p>
<p>if ($pck eq "") { &error(91) }<br />
if ($pck ne $pwd1) { &error(92) }<br />
} # end of if<br />
########################</p>
<p># 削除の場合<br />
if (($in{'action'} eq 'teisei') && ($in{'syori'} == 2)) { &sakujo;
return }</p>
<p># ここからは訂正選択時処理</p>
<p># データ訂正<br />
# 1 2 3 4 5 6<br />
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード<br />
$value = "$keyno\t$namae\t$naiyo\t$sasidasi\t$symd\t$pwd1\n";<br />
$idxdt{$keyno}=$value;<br />
&file_write;<br />
} # end of teisei</p>
<p>#####################<br />
# データ削除<br />
#####################<br />
sub sakujo {</p>
<p># データ削除<br />
delete $idxdt{$keyno};<br />
&file_write;<br />
} # end of sakujo</p>
<p><br />
##########################<br />
# ファイル登録共通処理 #<br />
##########################<br />
sub file_write {</p>
<p># 登録用配列にデータセット<br />
%new=();</p>
<p># 配列データを降順にソートする(keysでは登録順に値が返されるとは限らないため)<br />
@data=sort by_date keys(%idxdt);</p>
<p>foreach (@data){<br />
# 通常では発生しないが開発途中での空のデータを除く(10は適当)<br />
if (length($idxdt{$_}) > 10) {<br />
push(@new,$idxdt{$_});}<br />
} # end of foreach</p>
<p># ファイル登録<br />
if (!open(WRITE,">$file")) { &error(0); }<br />
flock(WRITE,2);<br />
print WRITE @new;<br />
flock(WRITE,8);<br />
close (WRITE);</p>
<p>} # end of write<br />
####################################<br />
# #<br />
# キー(日付)を降順ソートする #<br />
# #<br />
####################################<br />
sub by_date { $b cmp $a }</p>
<p>################ end of script ###################</p>