Perl の基本
忘れた頃にPerlプログラムを作るので、いつも同じところでつまずき、堂々巡りしている気がします。ということで、そのPerlについていつも疑問に思う点について整理してみます。プログラマではないので用語はいい加減です。勘違いなどもあるかもしれません。
HTMLのフォームとの関連
method = POST とか method = GET って何
フォームに入力されたデータの受け渡し方法には二種類あって、一つはPOSTでもう一つがGETです。デフォルトはGETです。
GETはURLに ? をくっつけて、その後にdata1=x&data2=y などとしてだらだらとデータをCGIに送ります。
POSTはURLとデータを区別して、別のかたまりとして送ります。
データ量が多い場合はPOSTを使います。
フォームから受け取ったデータはどこから受け取る
GET の場合は 環境変数 QUERY_STRING から
POST の場合は標準入力 からデータを受け取ることが出来ます。
具体的にはどうやって受け取ればいい
GETの場合は
$data = $ENV{'QUERY_STRING'};
POSTの場合は
read (STDIN, $data, $ENV{'CONTENT_LENGTH'});
で受け取れます。(標準入力から、CONTENT_LENGTHにセットされた文字数分だけデータを読み込むという意味)
あとは受け取ったデータ
$data
を好きなように加工すればいいだけです。まとめてしまえば簡単ですが、ここが私にとっては第一の関門でした。
データの分離と加工
$data は data1=x&data2=y というかたまりなのでそのままの形では役に立ちません。$dataを& で分割し、さらに=で分割して変数と値のセットを取り出さないと個々のデータとしては使えません。
そのためには
foreach $set (split(/&/,$data)){
($key, $value) = split(/=/, $set) ;
$FORM{$key}
= $value;
}
とすれば、OKです。
$FORM{"data1"} = x
$FORM{"data2"} = y
$FORM{"data3"} = z
という風に代入されます。
2行目は$($key) = $value; では駄目なんでしょうか?$FORM{"data1"} と書くのはなんだか面倒な気もするのですが・・・。
でも、とりあえず、データを取り出せればなんでもいいです。どうせコピー&ペーストして使うだけなので。
文字のデコード
それから、文字のデコードも必要です。
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
+ であらわされたスペースを元に戻しています。
あと、16進数であらわされた文字コードを元の文字に戻しています。
CGI.pm
**********************
- Perl 時刻の処理はとりあえずこれで 2008/12
- Internal Server Error でCGIプログラムが動作しない 2008/08
- Perl のエラー解決と疑問点整理 2008/08