Home / Menu

CGI-Perlの基礎講座

CGI-Perlの基礎講座(p03)

(本ページは、KENT WEBのFantasyボードプログラムをステップ単位に説明しています。)

◆ ワード検索処理(443から532行目)

・概要

ゲストがワード検索をクリックか、または検索文字入力後submitでここの処理にきます。
そして、検索文字がログファイルにあるかサーチして、一覧を出力します。

・443から532行目

## --- ワード検索
sub find {
    &header;
    print <<"HTML";
         :
         :
HTML

ワード検索用ページのHTMLをヒヤドキュメントで出力します。パール的には目新しいものはありません。

    # ワード検索の実行と結果表示
    if ($FORM{'word'} ne "") {

        # 入力内容を整理
        $cond = $FORM{'cond'};
        $word = $FORM{'word'};
        $word =~ s/ / /g;
        $word =~ s/\t/ /g;
        @pairs = split(/ /,$word);

$condはフォームで入力した検索条件 and か or で、$wordは検索文字で、漢字スペースやタブを半角スペースに変換しています。
そして、半角スペースをデリミタにして、@pairsへ検索文字を代入しています。

        # 検索処理
        print "<hr><OL>\n";
        open(IN,"$logfile") || &error("Open Error : $logfile","no");
        $i=0;
        while ($_ = <IN>) {
            $flag = 0;
            foreach $pair (@pairs) {
                if (index($_,$pair) >= 0) {
                    $flag=1;
                    if ($cond eq 'or') { last; }
                }
                else {
                    if ($cond eq 'and') { $flag = 0; last; }
                }
            }
            if ($flag == 0) { next; }

            # 結果を表示
            $i++;
            ($no,$date,$name,$mail,$area,$icon,
                $icon2,$com,$res,$url,$host,$pw) = split(/<>/, $_);

            if ($mail) { $name = "<a href=\"mailto:$mail\">$name</a>"; }
            if ($url) { $url = "<a href=\"http://$url\" target=_blank>http://$url</a>"; }

            print "<LI>[$no] 投稿者:<b>$name</b> <small> 投稿日:$date</small><br>\n";
            print "<blockquote>$com<P>$url</blockquote><hr>\n";
        }
        close(IN);
        print "検索結果は <b>$i</b>件です。\n";
        print "</OL>\n";
    }
    print "</body></html>\n";
    exit;
}

ここまで目新しいのは if (index($_,$pair) >= 0) だけです、
index関数は、$_(今回の場合、ログファイルから読み込んだ1行)に $pair(検索文字)が在る場合にその行の先頭からのバイト位置(ゼロオリジン)を返し、ない時は -1 を返します。
あと、foreach $pair (@pairs) も説明しときます。
これは、配列変数@pairsに格納されているリスト毎に$patrに代入されて、リスト分ループ処理行います。(foreachは超便利!)
全体の処理は、検索文字をログファイルから検索条件にしたがってサーチし、一覧をHTMLにして、標準出力しています。

管理モード処理(533から669行目)

・概要

管理者がゲストの書き込みメッセージ一覧を表示したり、特定のメッセージを削除したりします。
返信は別処理になり、ここでは返信処理を起動するまでです。

・533から669行目

## --- 管理モード
sub admin {
    if ($FORM{'pass'} && $FORM{'pass'} ne "$pass") {
        &error("パスワードが違います。","no");
    }
               :
               :
    }
    else {
        # 削除処理
        if ($DEL[0]) {
                     :
                     :
        }

        # 管理を表示
                     :
                     :
        # ページ区切り処理
        $start = $page + 1;
        $end   = $page + $p_log;

        open(IN,"$logfile") || &error("Open Error : $logfile","no");
        $i=0; $j=0;
        while ($_ = ) {
                         :
                         :
            if (length($com) > 50) {
                $com = substr($com,0,48);
                $com = "$com" . "...";
                        }
        }
                :
                :
    }
        :
        :
}

処理的には、初回はパスワード入力画面を表示し、入力後、パスワードチェックをし、書き込み管理情報を表示します。 チェックボックスをマークして、サブミットクリックで、削除処理を実行します。

パール的には、substr 以外目新しいものはありません。
substr関数を説明致します。

構文: $com = substr($com,0,48);

第一引数「$com」が対象文字列で、第二引数が開始位置、第三引数が取り出しバイト数です。
ここでは、ゲストが入力したメッセージ「$com」の位置0(文字列の先頭)から48バイトを$comへ代入しています。
結果的に$comを48バイトに切りつめているわけです。

返信レスフォーム、使い方表示、ユーザ記事削除の各々の処理(670から838行目)

・概要

返信レスフォーム、使い方表示、ユーザ記事削除の各々の処理は、パール的には、目新しいものはありません。 ですので、処理的に簡単な説明でスルーします。^^;

・670から838行目

返信レスフォーム処理(&res_msg)

パスワードをチェックして、レスの書き込みがあれば、処理をロックして、レスを更新登録します。
更新登録には一時ファイルを利用して行い、終了後、一時ファイルをログファイルに置き換え(rename)ます。

使い方表示処理(&howto)

使い方等を表示します。

ユーザ記事削除処理(&usrdel)

削除Noまたは削除キーをチェックして、該当データを削除します。

Home / Menu