CGI活用講座第8回、CGI作成編(3)です。
CGI活用講座、第8回は、作成編です。
ダウンロード&テストは、教材DownLoad です」
CGI活用講座→第8回に進んでください。
ダウンロードした教材は、アップロード用です、基礎講座を参考に、Perlのパスをサーバにあわせてください。
では、CGI活用講座第8回の開始です。
CGIファイルが、大きくなりすぎ、講座としてはこれが限界でしょう。
ということで、掲示板は今回で終わりです。
簡易掲示板としては、完成形、レス機能はファイルが大きくなりすぎますので、レス機能付き掲示板として、別に作成します。
チャット型掲示板も別に作成予定、できましたら公開しますね。
また、今回のものでも、手打ちは大変ですから、ダウンロードをご利用願います。
では、今回も、Perlの勉強開始しましょうか。
15行目から、自由設定部分をここにまとめました。
ご自分の環境に合わせればいい部分ですね。
レス機能をつけませんでしたから、18行の最大保存数500件くらいまでいけるかな?
動きの具合で調整してください。
時間の取り込みは、もっと簡単な方法もありますが、表示を考えた場合、この方法がよいようです。
今回も、CGI.pmの入出力を使用しますので、普通にprint文は使えません。
この2種類のどちらかの方法をお使いください。
40行の部分は、実際に設定してみて、ブラウザのソース表示で確認しながら、変えてみるといいでしょうね。これで、meta出力も、link出力もできます。
link出力はスタイルシートの設定ですね。
43行目からが、2つ目のprint文使用例、この場合、タブやスペースもprintしてしまい、エラーになる場合がある。
隙間なく書き込むのがよいでしょう。
記事の中のタグに影響を与えないように、すべてのタグに[class]を設定しておきます。
設定しても実際には使用してないclassも結構あります。
44行のwakuが一番大事、表示部分全体を左端から15px離すために使用します。
46行目のように、titleを全て変数に変えて、変更しやすくしましたが、その分だけ、コードは読みにくくなってます。
52行目から、メイン処理、submit送信をモードとして捕らえて、処理を分岐します。
これは、小生のプログラミングにおける常套手段、少し大きめのプログラムでは必ずこのようにします。
本来は、この先、サブルーチンへの引数により、処理を独立させるべきですが、今回は、このままにしておきます。
66行目、67行目は、全てのモードで呼び出すサブルーチンなので、if文の対象から外しました。
71行目で、先ほどのwakuを閉じてます。
実際は、サブルーチン先で、強制的に終了させますので、あちこちに同じ機能のタグが存在しているんです。
76行目からは、サブルーチンの領域です。
記事の表示位置を変える部分から、先に勧める部分、最大表示分を進めるために、総記事数($count)を求め、
現在のポイントファイル($kei)も読み出し。
本来は、処理の開始、と終了で、ファイルロック処理が必要ですが、今回入れてありません、この場合、ポイントファイルをロックすればよいでしょう。
総記事数を最大表示数で割って、小数点以下を切り捨てると、ポイントの最大値が得られ、ポイントを加えたとき、最大値を超えたら、0に戻します。
計算で得たポイントをポイントファイルに書き戻して、処理終了、
この後に、ファイルロックを解除すればよいでしょう。
11行目から、記事の表示位置を下げる処理、
やってることはポイントを上げる方法と同じことですが、最大値を超えたら0に戻せば良いわけです。
135行目で、係数を書き戻して終了です。
142行目から修正処理部分
ここでは、$passaにpassを取り出し、
記事ファイルから読み込んだ$passと比較するためです。
これは、記事番号の項目でも同じです。
149行の文字列比較は($pass eq "")とします。
「=」は代入になり、($passa = "")は、代入した結果が新であるかの意味、数値比較は、($passa == 0)の様にします。
取り出した記事番号から1を引いて、配列番号の初期値(0)に合わせて、一行を読み出して、読み出した行の$passと比較します。
163行目、$passaと$passが等しければ、修正モードに入ります。
165行で、取り出した部分の一行を消去、記事のログファイルに書き込んでおきます。
&&を(<br>)に書き戻して、改行を再現しています、元は(?n)でったんですが、元通りでは、表現がうまくいきませんでした。
175、176行は、タグの再現です。
178行以降は、修正用の入力欄でボタンの数を減らし、修正前の記事を事前入力して置きます。
199行目から、データ書き込み
ブラウザから投稿内容を受け取り、ログファイルの保存する処理です。
処理は、ほぼ前回同様、
記録するのは、このほかに現在時刻もありますが、時刻は事前に取り込み済み、
お名前、メルアド、コメント確認して、空なら記録をキャンセルしてますが、もう少し絞り込んでも良いかも・・・
222行からログファイルをチェック、
最大保持ログファイル数の規制、間違ってますね、これでは、最大保持数+1になってしまう。
230行のカウントが最大保持記事数以上にならないようにチェックしてます。
230行は、最終行を一行削除する命令です。
233行から、文字列を保存する前の事前整形部分です。
変換方法は、置き換えとマッチ代入の組み合わせ、書式を覚えてしまえば良いでしょう。
各データを切り分け文字(<>)を 挟んで並べて、一行に整形して、
先頭行に挿入し、
ログ記録ファイルに前文上書き保存です。
下の入力欄では大きな変更はありませんが、ボタンなどいくつか追加しています。
「submit」の使い方は、全て「name」を「submit」にしておき、CGI側で「submit」を呼び出して値を調べればOKです。
277行からは、データ表示部分
287行目は、引数を受け取るようにするための前処理、$lpを my宣言して、引数から受け取るように変更、$np&$ypもmy宣言すれば、完全なサブルーチンに変わります。
後の変数は全てグローバルに使用してます。
299行目から、表示用にコメント文を再整形する部分です。
304行からは、データを表示、CSSで多少色づけしてますが、class設定で、コメント本文に影響が最小になるようにしています。
表示記事番号が最大保持数以上になったら、記事カウントを0に戻します。
記事カウントは、記事番号−1であることに注意。
322行目から、エラー処理
ここは、変数確認の要らない完全サブルーチンになってます。
エラー出力後、exit;で、中途終了、
CGIを終了しますが、事前に、[戻る]ボタンを表示して、最初に戻れるようにしています。
344行からヘルプ
345行は、不要、消去しても結構です。
ここも完全サブルーチン、中で、新規変数を設定していません。
これで、簡易掲示板を終了します。
色々と研究して、もっと良いプログラムに変更してくださいね。
CGI活用講座、第8回を終了します。
|