□Perl 講座 特別編 > 最大保持数

◆最大保持数を設定できるようにしよう!

作った掲示板は本当に簡易ですので、これから最低限必要な機能を付け加えていきましょう!!その中で、改造・拡張能力を高めていければ?と思います。まず一番最初に考えたいのが、保存記事数を決めることでしょう。永遠にログが増えていくのでは困りますからね(^-^;;;



◆最大保持数管理ルーチン(プログラム)

では、実際に考えてみましょう!

今回ご紹介した簡易掲示板のログは、一行に一記事の投稿データを<>で分割して記録しています。これらを分割やくっつけてデータを活用しているのです。ですから単純にいくつの配列が存在するのかは、

    open(IN,"$file") || &error("Can't open $file");
    @lines = <IN>;
    close(IN);

    $logcount = @lines;

と言うように記述すると、$logcountに配列の数が代入されて、結果として記事数が幾つ存在するのかが容易に得ることが出来ます。どこのタイミングで保持数を管理するか?と言う問題だと思います。この簡易掲示板でそのタイミングは下記のとおりになります。
  1. 表示処理をする時
  2. 書込み処理をする時
ファイルをオープンする時($logcountの値が得られるとき)って事です。一例に過ぎませんが、最大記事保持数を$maxに指定しておき、$logcountがこれを超えた場合に$max以降の配列を書き込まなければ削除されたことになります。当然多少結果が違いますが(見た目は一緒)、この動作は表示処理の時でも書込み処理の時いずれにしても構いません。

例として書込み処理の時にさせる場合
#書込み処理プログラム
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 = <IN>;

    #現在のログ数を取得
    $logcount = @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);

    #ログ数の判定
    $max = $max-1;
    if ($logcount > $max) {
        pop @lines;
    }

    #ログの書込処理
    print OUT @lines;
    close(OUT);
    close(IN);
    rename($temp,$file) || &error("Rename Error");
    chmod (0666,$file);
    if (-e $temp) { unlink($temp); }
}

[sample2]

□特別編 一緒に簡易掲示板を作ってみよう