![]()
入力データの取り出し方
フォーム形式のデータから入力データを取り出す方法はいろいろあります。フォーム形式で定められた name属性で指定された名前とその値の組でデータを構成したほうが取扱が楽です。そして、入力データには次のような形式を持っています。Name1=Your+Name&Name2=Data&Name3=yesそして、サーバ側で入力データを簡単に取り出すツールには次のようなものがあります。
- 各名前/値の組はアンパーサンド記号(&)で区切られます。
- フォーム形式の名前/値の組はイコール記号(=)で区切られています(名前=値)。データがない場合、名前のみになります("name=")。
- 特殊文字(7ビットで表せないASCII文字)は16進数で%nn形式で表されます。特殊文字には =, &, % が含まれています(URLエンコード)。
- 空白はプラス記号(+)に置き換えられます。
- CERN httpdサーバであれば、cgiparse
- uncgi
- cgi-lib.pl
cgiparse
cgiparseプログラムはCERN httpdに含まれているユティリティ・プログラムです。CERN固有のものなので、他のサーバで利用するのは難しいでしょう。単純にCGIスクリプト内へcgiparseを実行すれば、form_theNameに収められます。/bin/sh から呼ぶのは、とするだけです。CGIスクリプトからcgiparseを呼ぶ場合、コマンドのフルパス名を記述するか、PATH変数あらかじめ指定しておく必要があるので注意して下さい。eval '/usr/local/www/cgi-bin/cgiparse -form'
![]()
uncgi
uncgiはSteven GrimmがC言語で作ったcgiparseと似た機能を持つプログラムです。cgiparseよりもpost形式の取り出しが簡単です。uncgiはcgi-binディレクトリへインストールし、action部でuncgiを指定します。次のようなフォームを指定していて、uncgiを使用してデータを取り出す場合、実行するCGIスクリプトの前にパス指定で置きます(ちょうど親ディレクトリのように見えます)。cgiparseのようにCGIスクリプトの中へ記述する必要がないので非常に便利です。<form method=post action="/cgi-bin/myscript.cgi">
![]()
<form method=post action="/cgi-bin/uncgi/myscript.cgi">
![]()
cgi-lib.pl
cgi-lib.plパッケージは、Steve Brennerが作ったPerlライブラリで、CGIスクリプトをPerlで記述した場合に用いられます。getやpostにも対応しており、結果をPerlの連想配列に入れ込みます。このライブラリの使用方法はスクリプトの最初に次のコードを加え、CGI用Perlライブラリを呼び出せるようにします。そして、データを読み込む場合、require 'cgi-lib.pl'
こうします。すると、data配列に入れられ、$data{theName}形式で取り出すことができます。&ReadParse(*data);
![]()
#!/usr/bin/perl print "Content-type: text/html\n\n"; require 'cgi-lib.pl'; &ReadParse(*data); print <<eod <head> <title>Results</title> </head> <body> <h2>Results</h2> eod print "<b>$data{'theName1'}</b> is first data.<p>"; print "</body>"
![]()
Perl簡易ライブラリ
Steve Brennerが作ったcgi-lib.plの古い版のライブラリも便利です。このライブラリの仕組みは、次のようになっています。ライブラリは、次のサブルーチンをCGI引数を読み込むファイルのどこかに置き、
- まず、request_method環境変数を見て、postならcontent_length分だけ$bufferに読み込みます。そしてgetの場合、query_stringを$bufferに読み込ます。(CGI引数の読み込み部)
- フィールド数が複数ある場合のために、$bufferを '&' で分割します。
- 分割した結果から、フィールド名と変数を分割し、スペース(+)をスペースに変換し、特殊文字の16進数文字を元に戻します(URLデコード)。
入力処理のときに、sub read_input { local ($buffer, @pairs, $pair, $name, $value, %form); # Read in text $env{'request_method'} =~ tr/a-z/A-Z/; if ($env{'request_method'} eq "post") { read(stdin, $buffer, $env{'content_length'}); } else { $buffer = $env{'query_string'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $form{$name} = $value; } %form; }
こうすれば、$form{'theName'}で取り出すことができます。%form = &read_input;
![]()
cgic
cgicはThomas Boutellが開発した CGIプログラミングのための ANSICライブラリです。このライブラリは以下から入手可能です。