- 1. cgi-lib.pl とは
- 2. cgi-lib.pl を利用するための準備
- 3. フォームからのデータを受け取る
- 3.1 フォームデータを変数に格納する
- 3.2 複数選択フォームデータを配列に格納する
- 3.3 nameリストを取り出す
- 4. HTTPヘッダの出力
- 4.1 標準HTTPヘッダの出力
- 5. HTMLドキュメントの出力
- 5.1 HTMLドキュメントヘッダ
- 5.2 HTMLドキュメントの締めくくり
- 5.3 エラーを出力する
- 5.4 エラーを出力しCGIを終了させる
cgi-lib.pl では、主に以下の二つの目的に役立ちます。
上に示したことをPerlスクリプトで作成することは、非常に面倒なことです。cgi-lib.pl を使うことによって、簡単に目的を達成することができます。ほかにもいろいろな機能がありますが、ここでは割愛いたします。
cgi-lib.pl は、perlライブラリーですので、CGI配布の際には同梱する必要があります。cgi-lib.plの本家サイトは、http://cgi-lib.berkeley.edu/ (英文)です。詳細はこちらをご覧下さい。
以下では Version 2.18について解説します。2001/06/16時点でVersion 2.18についての解説が公開されていませんでしたので、私がソースコードから解釈しております。
まず、呼び出し元のCGIファイルと同じ場所に、cgi-lib.pl をおいてください。そして、呼び出し元のCGIファイルから、cgi-lib.pl を呼び出します。
フォームに入力・選択された値を取得する方法を、以下のフォームを例にしたがって説明します。
まず、CGIに対して送信されたフォームデータを、連想配列に格納します。
これで、連想配列「%input」にフォームデータがすべて格納されている状態になります。連想配列のキーにはname属性が、値には各フォームデータが格納されている状態となります。
上記の例で、たとえば「お名前」の欄に入力されたデータをスカラー変数「$YourName」に格納したい場合には、
とすればいいのです。スカラー変数「$YourName」には、「太郎」が格納されます。他のフォームについても同様です。
では、複数選択可能なフォームである「チェックボックス」や「スクローリングリスト」の場合は、どのように取得するのでしょう。以下の例で説明します。
複数選択可能なフォームの場合にも同様にスカラー変数で受け取りますが、それぞれの値が \0 区切りで格納されます。\0 は出力結果をブラウザー上で見るとスペースに見えますが、実際にはスペースではありません。これは「ヌル文字」です。
上の例で、「OS」を取得すると、
となります。フォーム例では、OSに「Windows」「Unix」が選択されていますので、スカラー変数「$OsList」には、「win\0unix」が格納されます。同様に
とすれば、PC Maker には「富士通」「日本電気」「コンパック」が選択されていますので、スカラー変数「$MakerList」には、「fujitsu」「nec」「compaq」の3つの要素がスペースで区切られた「fujitus\0nec\0compaq」が格納されます。
では、各要素を取り出すにはどうすればよいでしょうか。
上記のように、「SplitPram」サブルーチンがcgi-lib.plには用意されています。これを使うと、正しく配列の要素に分解してくれます。
以上の説明の通り、name属性を同じにして、複数選択可能なフォームの場合には、valueにスペースが入っていようがいまいが、cgi-lib.plサブルーチン「SpitParam」をお使いになることをお勧めします。
フォームHTMLで指定された name の値のリストを取り出すには、前述の連想配列から keys関数を使って取り出します。
配列 @names には、「OS」「namae」という2つの要素が格納されます。
CGIでページを出力する際には、必ず標準HTTPヘッダを出力しなければいけません。各ヘッダを以下のとおりに出力することができます。(\n は改行を表します。)
| 記述例 | 出力内容 |
|---|---|
print &PrintHeader(); |
Content-Type: text/html\n\n |
start_html関数で、<HTML>, <HEAD>, <TITLE>, <BODY>タグを出力します。
| 記述例 | 出力内容 |
|---|---|
| print &HtmlTop("タイトルだよ"); | <html> <head> <title>タイトルだよ</title> </head> <body> <h1>タイトルだよ</h1> |
| 記述例 | 出力内容 |
|---|---|
| print &HtmlBot(); | </body> </html> |
CGIでHTMLを出力するときには、最後にこれを入れましょう。
| 記述例 | 出力内容 |
|---|---|
| &CgiError ("エラーだよ"); | Content-type: text/html <html> <head> <title>エラーだよ</title> </head> <body> <h1>エラーだよ</h1> |
エラーを出力する場合には、HTTPヘッダーを加える必要がありません。&CgiError がHTTPヘッダーを加えて出力します。&CgiError は、エラーを出力しますが、スクリプト自体を終了させません。もし終了したい場合いは後述の &CgiDie を使ってください。
| 記述例 | 出力内容 |
|---|---|
| &CgiDie ("エラーだよ"); | Content-type: text/html <html> <head> <title>エラーだよ</title> </head> <body> <h1>エラーだよ</h1> |
&CgiDie は、エラーを出力し、CGIを終了します。