※ここの解説は、後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
■ 6.HTML形式の表示
どうですか?CGIの基本は理解していただけましたか?
複雑なCGIを作成していくと一部フォルダの指定などが変わってきますが、基本的にローカルテストもサーバーでのテストも作成方法は同じです。
自分のパソコンで実行させるかサーバーで実行するかの違いです。
それと、以前にも説明したように、CGIはある一連の処理をするのが目的ですし、Perlはプログラム言語です。
あるひとつの連続した処理を行う場合でも、何通りもの方法や組み合わせがあり、その目的や使用する場面で変わる場合もあります。
また、人によってその方法も違います。
したがって、これから説明する内容は、一般的な方法や定石的な方法とatom個人のテクニックを紹介するのであって、ここに記述した方法がすべてでもありませんし、ベストな方法でないかも知れません。
しかし、CGIをこれから勉強しようとする方たちには何らかのヒントにはなると思いますので参考にして下さい。
それでは、CGIのサンプルをお見せしながら少しずつ解説していきます。
まず、「3.CGIのテスト」でテキスト形式の表示を行いましたが、ホームページのようなHTML形式を表示する場合の方法を説明します。
■ HTML形式のサンプル
- 【記述サンプル】
- #!/usr/bin/perl print "Content-type:text/html\n\n"; print "<HTML>"; print "<HEAD>"; print "<TITLE>HTML形式のテスト</TITLE>"; print "</HEAD>"; print "<BODY>"; print "CGIのテスト"; print "</BODY>"; print "</HTML>";
まず、1行目は前回でも説明したように、サーバーのどこにPerlがあるかを指示しています。
次に3行目が前回と変わっているのがお分かりでしょうか?
そうです。text/plainの部分がtext/htmlに変わっていますね。
これで、ブラウザは「これから来る文字はHTML形式だな」っと理解するわけです。
4行目以降は、「HTMLの解説」で説明したHTMLの基本形です。
printの後の「"」はダブルクォーテーションと読みまして出力文字の必ず最初と最後に記述します。
print命令に「ここからここまでが文字だよ」と教えるわけです。
(このように、特殊な意味を持つ文字をPerlでは、メタ文字と言います。)
さあ、前回と同様にこの文章をエディタなどで入力し、今度は「htmltest.cgi」と名前を付けてまた、「cgi-bin」フォルダに保存しましょう。
そして、前回と同様の方法で実行してみましょう。
■ CGIの実行
上記のCGIが準備できたら、まず、ローカルでテストしてみましょう。
手順は次の通りです。
- 【実行方法】
-
- HTTPDを起動します。
- ブラウザを起動し、アドレスに「//127.0.0.1」と入力します。
ホームページが表示されます。 - 次に、アドレスに「//127.0.0.1/cgi-bin/htmltest.cgi」と入力します。
ブラウザのタイトルに「HTML形式のテスト」と表示され、画面に「CGIのテスト」と表示されます。
どうですか、うまく表示されましたか?
特にタイトルに「HTML形式のテスト」と表示されることを確認しておいて下さい。
さて、ここまでができるようになると「な〜んだ、じゃあ簡単だ。HTMLをprintで記述していけばいいだけじゃない。」と思いますよね。(誰でも思います。)
ところが、ここにいくつかの落とし穴があるのです。
この落とし穴に落ちてしまってなかなか出れない人を何度見たことか..(自分もその一人です)(爆)
■ HTML形式の落とし穴
例えば、上記の例でいうとBODYタグがそうです。
あなたが、上記の実行テストがうまくできると「じゃあ文字色や背景色を変えてみよう。」と思います。
さあ、ここです。
落とし穴が目の前にあるのに気が付かないのです。
通常なら
print "<BODY TEXT="red" BGCOLOR="#99ff99">";
のように書きますよね。
こう書いたあなたは落とし穴に落ちてしまいました。
この書き方では、CGIはエラーで実行できなくなるのです。
理由は、上記に書いたように
"はダブルクォーテーションと読みまして出力文字の必ず最初と最後に記述します。
という規則から外れてしまうからです。
よ〜く見てください。ダブルクォーテーションが全部で6個ありますね。
文字列の前後にダブルクォーテーションを使う方法は間違いではないのですが、その文字列の中にダブルクォーテーションが存在してはいけないのです。
2つ目のダブルクォーテーションが見つかったとき、Perlは文字列が終了したと認識します。
ところが、その後にまだ文字列が続いているのでエラーが発生してしまうのです。
それでは、回避策をまず、2つ説明します。
1つ目は、ダブルクォーテーションをクォート風演算子というものに置き換えてしまう方法です。
クォート風演算子とは、ダブルクォーテーションと同じ機能でありながら、記述方法を変えたものです。
""(ダブルクォーテーション)の場合はqq{ }に置き換え、''(シングルクォーテーション)の場合はq{
}に置き換えます。
また、このクォート風演算子は非英数文字が使用できますので、{ }以外にも( )、[ ]、//、##などで記述することもできます。
例えば、先ほどの例であれば次のような記述に変更することができます。
print qq{BODY TEXT="red" BGCOLOR="#99ff99">}; print qq(BODY TEXT="red" BGCOLOR="#99ff99">); print qq/BODY TEXT="red" BGCOLOR="#99ff99">/;
などと記述する方法です。
私は、わかりやすく( )を使用することが最も多いです。
もちろんqq( )にすればすべてが片付くわけでもありません。
そうですね、今度は文字列の中で()が使用できなくなるという新たな問題が発生します。
この方法は、「どんな文字でも大丈夫。」というわけには行きません。
そこでもうひとつの方法です。
文字列の中のダブルクォーテーションを特殊な意味を持たさないように文字化してしまう(クォートするという)方法です。
その方法は、クォートしたい文字の前に半角の¥(円マーク)をつけます。
注)¥(円マーク)はWindows系のマシンの場合であって、MACやUNIX系では半角の\(バックスラッシュ)となります。
したがって、上記の記述は次のように記述します。
print "<BODY TEXT=\"red\" BGCOLOR=\"#99ff99\">";
いいですか、最初にも言いましたように、方法はひとつではないのです。
何通りもある中から自分が最も適当だと思う方法を見つけることです。
また、それをベースにし、自分なりの記述方法を培っていって下さい。