私の使っているゲストブックの全体の構成は、guest.html によって最初にゲストブックの書き込み画面を表示し、ゲストブック guest.txt への書き込みを guestadd.cgi に担当させ、ゲストブックの表示を guestsee.cgi に担当させています。このページでは perl で書かれた 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() に相当します。
次の三つのサブルーチンは 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";
}