めざせ、HTMLの鉄人!

「HTML教室」(CGI篇・その2)

前のページ 次のページ

私の使っているゲストブックの全体の構成は、guest.html によって最初にゲストブックの書き込み画面を表示し、ゲストブック guest.txt への書き込みを guestadd.cgi に担当させ、ゲストブックの表示を guestsee.cgi に担当させています。このページでは perl で書かれた guestsee.cgi を紹介します。


5 guestsee.cgi のメインルーチン

次は guestsee.cgi のメインルーチンです。

#!/usr/bin/perl

# ヘッダの送出
print "Content-type: text/html\n\n";

# データファイルのオープン
if (!open(TXT, "guest.txt")) {
    &print_error;
}
else {
    &page_top;
    # データファイルをすべて表示
    while (<TXT>) {
           print;
    }
    &page_end;
    # ファイルをクローズ
    close(TXT);
}

# 終了
exit(0);

順を追って説明します。

#!/usr/bin/perl

これは、perl プログラムの最初にかならず書かなければならないものです。空白を入れないで一気に書いてください。/usr/bin/perl によってこのプログラムを実行せよという意味です。あなたのシステムの perl が /usr/bin に入っていなければ、もちろんこの行を書き換える必要があります。perl がどこにあるかは which perl とすればわかります。

# ヘッダの送出
print "Content-type: text/html\n";

ゲストブックにあるデータを書き出す前に、これが text/html であることをブラウザに教えなければなりません。それがこの行で、perl の print は BASIC の print 文に似ています。\n は改行記号です。

# データファイルのオープン
if (!open(TXT, "guest.txt")) {
    &print_error;
    }

ファイルの open は上記のようにします。TXT はファイルポインターで、その次はファイル名です。ファイル名は " でくくるようにします。!open は open できなかったことを意味します。この場合はエラーを示すようにするのが親切でしょう。

&print_error の & は sub print_error サブルーティンに行くことを意味します。if{ } else{ } の構文は C と同じです。以下、ファイルが正常にオープンした場合の処理が続きます。

else{
    &page_top;
    while (<TXT>) {
           print;
        }
    &page_end;
    close(TXT);
}

ページの最初と終りの部分は sub page_top と sub page_end の二つのサブルーチンにまとめました。C と違ってサブルーチンへの引数がなければ、ファンクションの後に () はつけません。

while(<TXT>){ print; } は、ゲストブックのデータがある間はそれをプリントせよという命令で、これでゲストブックの内容を全部表示することができます。ファイルは open したら close しなければなりませんので、close(TXT) と書きました。

# 終了
exit(0);

これで仕事は終りです。exit(0) は正常な終了を意味します。#!/usr/bin/perl から exit(0) までが C の main() に相当します。


6 guestsee.cgi のサブルーチン

次の三つのサブルーチンは HTML そのもので、ほとんど説明がいらないでしょう。" や @ を print 文で使うには \" \@ とします。\ を忘れると perl はエラーを出してきますので注意が必要です。

# エラー表示
sub print_error {
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=EUC-JP\">\n";
    print "<TITLE>ゲストブック・エラー</TITLE>\n";
    print "</HEAD>\n";
    print "<BODY>\n";
    print "<UL><UL>\n";
    print "<H1>データファイルにアクセスできません</H1>\n";
    print "恐れ入りますが、再度試していただくか、";
    print "<A HREF=\"mailto:webmaster\@penguinclub.net\">webmaster\@penguinclub.net</A>";
    print "までお知らせください。<BR><BR>\n";
    print "<HR>\n";
    &page_end;
    exit(0);
}

# ページのはじめ
sub page_top {
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=EUC-JP\">\n";
    print "<TITLE>ゲストブック</TITLE>\n";
    print "</HEAD>\n";
    print "<BODY BACKGROUND=\"./images/crc-back.gif\">\n";
    print "<UL><UL>\n";
    print "<CENTER>\n";
    print "<IMG src=\"./images/penguin_club.gif\"><BR>\n";
    print "お寄せいただいたコメント<BR><BR>\n";
    print "<A HREF=\"guest.html\">ゲストブックに記入する</A>\n";
    print "  ";
    print "<A HREF=\"index.html\">ホームページに戻る</A>\n";
    print "</CENTER>\n";
    print "<HR>\n";
}

# ページの終わり
sub page_end {
    print "<BR>\n";
    print "<CENTER>\n";
    print "<A HREF=\"guest.html\">ゲストブックに記入する</A>\n";
    print "  ";
    print "<A HREF=\"index.html\">ホームページに戻る</A>\n";
    print "</CENTER>\n";
    print "</UL></UL>\n";
    print "</BODY>\n";
    print "</HTML>\n";
}

前のページ 次のページ



[INDEX]