■ CGI初歩の初歩

■ 掲示板を作成する3

スクリプト 実行
 今回は2つのことをしました。最初の改良は1つのページに全ログを表示していたのを改め、指定された数だけ表示するようにしたことです。
 DispLogルーチンを改造しました。ログを表示するときに$topより前のログだったら、読み飛ばすようにしています。その後、$nextまでを表示しています。さらにログを表示し終わった後、prev nextを必要に応じて付加しています。

sub DispLog {
    my $next = $top + $numPerPage;
    my $prev = $top - $numPerPage;
    my $i;

    if( !open(IN, $log_file) ) {
#       print "ファイルがオープンできません<BR>\n";
    }
    else {
        $i = 0;
        while ($line = <IN>) {
            if( $i < $top ) {
                ++$i;
            }
            elsif( $i < $next ) {
                ++$i;
                my ($no, $date, $name, $title, $mail, $comment, $home) = split(/<>/,$line);
                print <<"EOM";
<table align="center" width="90%" cellpadding=1 cellspacing=1 class=C1>
<tr>
<td>$no <font color="blue"><b>$name</b></font> $date $title <a href="mailto:$mail">mail</a>
<a href="http://$home">home</a></td>
</tr>
<tr>
<td><hr>$comment</td>
</tr>
</table>
<br>
EOM
            }
            else {
                break;
            }
        }
        close(IN);
        my $flag = 0;
        if( $top != 0 ) {
            print "<div align=\"center\"><span class=C2><a href=\"$script?no=$prev\">Prev</a>";
            $flag = 1;
        }
        if( $flag == 1 ) {
            print " ";
        }
        if( $i == $next ) {
            if( $flag != 1 ) {
                print "<div align=\"center\"><span class=C2>";
            }
            print "<a href=\"$script?no=$next\">Next</a>";
            $flag = 1;
        }
        if( $flag == 1 ) {
            print "</span></div><br>\n";
        }
    }

}

 もう一つの改良は、今まで何処までもログを保存しようとしていたのですが、これを改め指定のメッセージ数までで制限するようにしたことです。
 WriteMessageルーチンの中のログを書き出しているところで、蓄積されているログのメッセージ数を求めて、マックスに達していたら一番古いメッセージを捨てるようにしました。
 $length = @bufで配列の要素数を得られるのですね。最初、これが分からずインターネットを色々見てやっと発見しました。

        my $length = @buf;
        if( $length == $numMaxMsg ) {
            print OUT @buf[0..$length-2];
        }
        else {
            print OUT @buf;
        }