CGIへのデータ渡し(1)

真里:加藤真里  シレ:シレスト=ノイデルファーム

シレ:さて。前回までのスクリプトは、確かにCGIとして動きますが、何か足りないような気がします。わかります?

真里:……えっと……あれならHTMLと、あとJavaScriptくらいで何とか実現できるってこと。

シレ:……そうですね。たとえばファイルの更新日付を出したり現在時刻を表示したりするのは、JavaScriptで可能です。今は素材集としてそこらじゅうに公開されてますよね。

真里:そうそう。コピーして、貼付けて、はい終わり。

シレ:ほかにも何かしら動的、というか、使っている人の操作にあわせて何かを変える、という技術はあります。例えばJavaアプレットやShockwaveなどもそれですよね。
……裏を返せば、今からあなたが作ろうとしているものがCGIで実現したほうがいいかどうか考えてみる必要があるということですが。
でも……掲示板なんかはどう頑張ってもそういったものでは作れませんよね。

真里:確かにJava掲示板なんて見たことないし。あ、でもさ、Flash掲示板なら見たことあるよ。

シレ:それは「書き込みをするフォームの部分」だけですよね。

真里:うーん……

シレ:こういうふうに、何かしらサーバ側にデータを保存しておきたい、サーバ側のファイルを使っている人の操作に応じて変えたい、など、アクセスログをとったり掲示板を作ったりするのに必須のものは、とりあえずCGIでしか実現できません。

真里:ふーん。で……さ、どうするの?

シレ:ファイルへの保存の仕方はちょっと触れましたよね?

真里:えーっと、openして、printして、closeして……

シレ:そうです。この他にファイルにロックをかけるflockというのもあるんですが、これはのちほど。ともかく、保存はできるわけですが、ではどうやってCGIにデータを受け渡しするんでしょう?

真里:……なんかいぢめて楽しんでない?

シレ:そ、そんなことないですよっ、、、

真里:……あ、そうだ、たしかどこか……そうそう、検索エンジンとかで、ファイル名の後に?がついて、その後に意味がわからないアルファベットと数字が並んでた。
http://www.hoge.com/~funya/find.cgi?unyo=ukyo&funya=%3e%54%36%22
とかいうふうに……

シレ:はい、そこです!それがデータを渡す方法のうちの1つです!

真里:なーんだ。じゃ解決したね。それじゃ。

シレ:……まだ解決してませんよ!……はい、で、その?から後の文字はいったいどこで受け取るんでしょう?

真里:げー、やっぱりいぢめてる〜〜

シレ:わ、わかりました、、、それではさっぱりと答えの方へ。実はこの中身は全て$ENV{'QUERY_STRING'}に入っています。つまりhatena.cgi?Shillest、というふうに呼び出せば$ENV{'QUERY_STRING'}の中身は'Shillest'になるわけです。

真里:げげ、実はそんなところに、、、

シレ:よく見るとこのENVというもの、実は以前言った「ハッシュ」ですよね。この%ENVには「環境変数」という、有用なデータが入っています。

真里:だけどさ、さっきの例で「funya=%3e%54%36%22」とかいうナゾの%とアルファベットがいっぱいならんだ部分があるじゃない。あれ何?

シレ:あれは、ふつうの半角アルファベット・数字以外の文字を特殊な形であらわしたものです。詳しく話せばいろいろ「文字コード」とかややこしいことになりそうなので控えておきますが、下のようなスクリプトで元のデータに戻せることだけ書いておきます。

$data = $ENV{'QUERY_STRING'};
$data =~ tr/+/ /;
$data =~ s/%([\da-f]{2})/pack("C", hex($1))/eig;

……ちなみに$dataの部分は使い方にあわせて好きなものに変えてくださいね。

真里:わ、わかんないんだけど……今の……だいたい"=~"とかs/とかtr/とか謎なモノが並んでるし……

シレ:えーっと、これもですね、実は「正規表現」というものを使っていまして、それこそホントに本が一冊書けるくらいの内容になるんです(実際そのものずばりの題の本が出てますし)。のちほどさらっと基本的な部分だけ書いてみますが……自信ないです(汗)

真里:やっぱり〜、シレスト先生だってわからないことあるんだ!

シレ:……なんだか悔しいですが、確かにそうです(苦笑)

真里:と、ゆーわけで、続きは次回ね!

[次回に続く……]

 

←PREV | NEXT→

Return : Perl Top