|
さて、今度は、CGIスクリプト(test.cgi)によるデコード処理を見てみましょう。ソースは、前回も使用した「Perl Editor」に登録されている「初期設定」を使います。
改行位置が若干異なりますが、スクリプトの動作上問題はまったくありません。
なお、ここで、配列とか連想配列、xx関数など、知らない言葉が出てくるかもしれませんが、そこで思考をとめないように。できれば、どんな意味なのかを自分で推理してみるのも一興です。後で意味を知ったとき、当たっていても外れていても、使い方を忘れることは決してないでしょう。
# 入力形式の設定 標準='POST' その他'GET'
# 登録ボタンを押して Method not implemented.. 等というエラーが出る場合は
# GET で試すこと
# GETの場合は不要な悪戯を受けてしまう環境になりますので、注意してください.
$method = 'POST';
中略
# フォームからのデータを取得
if ($method eq 'POST' && $ENV{'QUERY_STRING'} ne '') { &error('要求エラー','POSTかGETしか受け取れません。');
}
以上は、methodがPOSTで、直接スクリプトのURLを指定して起動しようとしたときにエラーメッセージを出してスクリプトを中止するための処理。
if ($method eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
以上は、methodがPOSTの場合の処理。
読み込まれたデータを変数$bufferに格納しています。
($bufferはここではじめて登場します)
@pairs = split(/&/, $buffer); }
ここで、split関数を使って、$bufferに格納されているデータを「&」で分割し、配列@pairsへ格納しています。
(配列@pairsはここではじめて登場します)
elsif ($method eq 'GET') { @pairs = split(/&/, $ENV{'QUERY_STRING'}); }
以上は、methodがGETの場合の処理。送られてきたデータを「&」で分割し、配列@pairsへ格納しています。GETでは、変数$bufferは存在しません。送られてきたデータを直接@pairsへ格納します。
else { &error('要求エラー','POSTかGETしか受け取れません。'); }
以上は、methodがGETでもPOSTでもなかったときの処理。エラーメッセージを出して処理を中止します。
# フォームからのデータを連想配列に格納
foreach $pair (@pairs)
{
配列@pairsの内容を、foreach関数を使って一つづつ取りだします。
($name, $value) = split(/=/, $pair);
split関数を使って、取り出した内容を「=」で変数「$name」と「$value」に分割します。
(変数$name,$valueは、ここではじめて登場します)
$name =~ tr/+/ /;
$nameに「+」が含まれていた場合、半角スペースに変換します。
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
%から始まるエンコードされたデータを、通常の日本語に戻します。
この式は、そのまま覚えてしまいましょう。
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
同じようにして$valueのデータを処理します。
&jcode'convert(*name,'sjis');
&jcode'convert(*value,'sjis');
jcode.plを使用して、$name,$valueをSJISに変換します。
この式もこのまま覚えてしまいましょう。
# 入力データのチェック
# タグが入力されていれば、それを無効にする。<などに置き換え表示してる
$value =~ s/</</g;
$value =~ s/>/>/g;
正規表現のs//g;構文を使って、文字を置換している。
# 区切り文字の”,”があれば”,”に変換
$value =~ s/\,/,/g;
半角カンマを全角カンマに置換しています。
# 改行コードを<br>に変換(上からWin、Mac、Unix用の処理)
$value =~ s/\r\n/<br>/g;
$value =~ s/\r/<br>/g;
$value =~ s/\n/<br>/g;
これも、正規表現のs//g;構文を使って、文字を置換している。
# 連想配列に格納
$FORM{$name} = $value;
ここで連想配列に格納したことで、$FORM{'名前'}と指定すると山田太郎と表示できるようになります。
}
何も考えず、このソースをそのまま使用すれば、連想配列を使って、自由にフォームから送られてきたデータを自由に利用することができます。
以上が、デコードの基本的な処理の仕組みです。なお、Web裏業では、違った処理の方法を取っています。基本的には同じことをしているのですが、人によって処理の方法が異なることがありますので、興味があったら見比べてみてもいいでしょうね。
ちなみに、Web裏業の方法では、送られてきたデータの形式が「GET」か「POST」かを自動認識するので、必要に応じて両方を使い分けることが可能です。上記の方法では、どちらか一方の方式しか指定できません。
スクリプトの用途によって使い分けてください。
|