フローチャート(新しいウィンドウで開きます)
この図を見ながら読むと、多少はわかりやすいかと思います。
まずはLogファイルを読みこみます。
書き込みの時と同じように、ファイルが開けなかったらエラーを表示させるようにします。
そして、開いたファイルを一件ずつに分割していきます。
すると次のように成ります。
if (!open(OUT, "< $file")) { push(@msg,"ファイルの読み込みができませんでした。"); &error; } while () {chop; push(@out, $_);} close(OUT);
While文の中の<OUT>というのは$_=<OUT>と一緒の事を表していて、意味はOUTから1行ずつ読みこんで$_に格納するという物です。
$_というのは、Perlには命令に変数名を省略できる物があり、省略した場合にはそれぞれに合わせて$_、@_などが対象となります。
この場合1行は文字列なので$_が対象になります。
その読みこんだ1行をchop命令で最後の改行コード(\n)をとり、@outへ格納していきます。
さて、CGIで表示させる時は普通HTMLの形を取ります。そこで、HTMLのヘッダ部分を考えていきます。
printという命令で出力していきます。
print <<"EOT";$MAIN_TITLE $MAIN_TITLE
ここで、MAIN_TITLEには掲示板の名前が入っているとします。
Print <<"xxx";~~~~~~~xxx
というのはxxxからxxxまで出力するという命令で、Plint "~~~";と書いてあるのと一緒です。
1つ目の赤く示した「bbs.cgi」というのはこのcgiのファイル名が入ります。
そして、二つ目の赤く示したところは書き込みなのか読みこみなのかを判断するためにある変数です。
2度目以降にこのCGIを参照するとmodeにはwriteが入っているという事になります。
本文は繰り返し作業になるのでforeach文を使って読み込んだ物が無くなっているところまで繰り返します。
しかし、そのままだと発言数が増えた時にかなり長い間表示されつづけるので、カウンターを作って適当なところで終わらせます。
そして、表示をさせてカウンターがMAXになるか、発言が無くなるまで表示します。
$num = 0; foreach (reverse @out) { last if $num == $max; $num++; ($name,$mail,$home,$text) = split(/<>/); print <<"EOT";
名 前:$name
URL: $home
$text\n; EOT exit; }
$numというのがカウンターで$maxというのが最大発言数です。この最大発言数は最初のところで指定しておいたものです。
あと、発言が新しい物ほど配列の下に入っているのでreverse関数で1番下の物が1番上に来るように逆順にしています。
ホームページ部分は好きに作ってください。
すべてを合わせると、
sub output{ if (!open(OUT, "< $file")) { push(@msg,"ファイルの読み込みができませんでした。"); &error; } while () {chop; push(@out, $_);} close(OUT); print <<"EOT"; $MAIN_TITLE $MAIN_TITLE
EOT $num = 0; foreach (reverse @out) { last if $num == $max; $num++; ($name,$mail,$home,$text) = split(/<>/); print <<"EOT";
名 前:$name
URL: $home
$text\n; EOT exit; } }
このようなプログラムになっています。
Copyright (C) 2011 ほぷしぃ. All Rights Reserved.