PC-Blues #13  CGI & Perl入門

突然かつ、いまさらだが、CGIというものを始めることにした。別にこれといった理由はない。まあ、老後までたのしめるお遊びとして、金もかからずよさそうと思ったからである。CGIなどにせず、ローカルで動くだけにすればますます金もかからずヨイわけだが世間に発表の機会を残したい気もして…。

さてCGIの正確な定義すら知らないが、ウェブサーバとブラウザの間で動くプログラムの一種くらいでよかろう。ほんとかな。まあ、ともかく、htmlに<form>というタグを入れておくと、そこに書きこんだ情報がサーバで受けとれるから、そいつを適当に加工してまたブラウザにかえしてやると、そんな感じらしい。加工の部分はサーバ次第でシェルプログラムでもPerlでもCでもよい。いまハヤリはPHPとRubyらしい。とりあえず3webのサーバはPerlが使えて、たいがいのサーバで使えるようだ。なので、Perlを始めることとした。

とりあえず、ローカルにウェブサーバをインストールする。別にローカルにインストールする必然性はないが、あればテストがラクである。PlamoはCDのcontrib/WWW/にapache.tgzがあるので、installpkg apache.tgzでインストールできる。このあと /etc/rc.d/rc.httpd を実行すれば、はやくも起動する。htmlは ~/public_html/ 以下に CGIプログラムは /usr/local/apache/cgi-bin/ 以下におけば、デフォルトでOKだ。

htmlにおくフォームは <form action="http://localhost/cgi-bin/test1.cgi" method="get"> と書いてやると、ローカルのサーバの/usr/local/apache/cgi-bin/ にあるtest1.cgiというプログラムが受けとる。

<input type="hidden" name="0" value="key1"> と書けば、htmlには何も表示されないが、プログラムは "0=key1" という引数を受け取る。
<input type="radio" name="1" value="a">
<input type="radio" name="1" value="b">
<input type="radio" name="1" value="c">
<input type="radio" name="1" value="d"> と書いておくとhtmlにはラジオボタンが4つ現れ、1つだけがチェックできる。プログラムには 1=a とか 1=c とかいう引数が与えられる。

<input type="text" name="2"> これは、1行文字列であるが、漢字は% + 文字番号になってしまうので、プログラム側で戻してやらねばならない。Perl では s/%(..)/pack("C",hex($1))/eg を使ってなおすが、 JIS|SJIS|EUC-JPのどれで書きこんでくるか判らないので、受けとり側でどれかに揃えてやらないとならない。3webはnkf が使えるのでこれを使ってみた。

<input type="password" name="3" > これはtextと同じだが入力時には*****でマスクされる。

<input type="submit" value="提出"> これで入力を終えて送信。

<input type="reset" value="リセット"> これはここまでの入力をリセットする。

<input type="image" name="4" src="xxx.png" value="IM">図を出し、クリックした位置を返す。xy座標が返ってくる。

</form> フォーム終わり。

さて、入力の受け取りだが、form のmethod=がgetならば、shでは$QUERY_STRINGにperlでは$ENV{QUERY_STRING}に、method="post"ならば標準入力に入っている。perlではwhile(<>)で$_に入る。上のだと、"0=key1&1=a&2=%25%68%c2&3=af3214"こんな形で受け取ることになる。そこで、
@argv = split /&/;
&で区切って配列@argvに代入する。
foreach(@argv){
($key,$val) = split /=/;
$hash{$key} = $val;
}
配列@argvを要素ごとに=で区切って、前者を$keyに後者を$valに代入する。
そのあと、ハッシュ%hashにおさめる。
$hash{2} =~ s/%(..)/pack("C",hex($1))/eg;
$hash{2}に格納された文字番号を文字に直す。
これで、それぞれの内容は$hash{0}〜$hash{3}で参照できる。

さて、習作としてこしらえてみたのが
日本史クイズ
日本史クイズ各個撃破版
インスタント・サッポリアン
である。プログラムは日本史クイズはここ日本史クイズ各個撃破版はそこインスタント・サッポリアンはあそこにおいておくから、興味のあるかたは見るなり、使うなり、改造するなり、わたしにメイルをくれるなり、罵詈雑言をくれるなりしてください。質問なんかは、サッポリアンのページにください。ただし、私の技術レベルはあなたよりきっと低いことは覚悟しておいてください。急に丁寧表現になるあたりに馬脚でまくりですが。

[前へ] [次へ]
[Home] [目次]