◆デコード?
ブラウザや外部ファイルからのデータと、CGIスクリプトとの間でやり取りする場合(殆どがこのケースだと思います)、ENCTYPEを[multipart/formdata]としない限りそれらのデータはURL形式にエンコードされてやり取りされます。ですから、CGIスクリプト上で計算や判別させるために、元の形に復元させてから出ないといけません。復元することをデコードするって思ってもらっていいと思います。逆にエンコードとはデータをやり取りするために暗号化することってこの場では認識すると良いでしょう。では、実際にどうやってそれをデコードしたらいいか、例で上げておきます・・・。
内容をこの時点で深く考えなくても、まだ現時点では良いですよ♪少し内容がわかる人は、コピーアンドペーストして活用してみても良いでしょう( ´Д`)b
#デコードするためのプログラム
# プラウザからのデータ取込み
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
# プラウザからのデータ変換
$i = 0; #※2
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
#1行毎に$name,$valueを取り出す
($name, $value) = split(/=/, $pair);
# 変換演算子 tr + を スペースに置き換え
$value =~ tr/+/ /;
# 変換演算子 s/// 単語の構成文字にマッチ
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# " を " に変換
$value =~ s/"/"/g;
#\n を "" に変換
# $value =~ s/\n//g;
# 日本語に変換(デコード処理部分)
&jcode'convert(*value,'sjis');
&jcode'convert(*name,'sjis');
$FORM{$name} = $value; #※1
@num[$i]=$value; #※2
$i=$i++; #※2
}
※1:INPUTタグ内のnameパラメータにセットした値とvalueパラメータにセットした値に関連をもたせたい場合。# プラウザからのデータ取込み
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
# プラウザからのデータ変換
$i = 0; #※2
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
#1行毎に$name,$valueを取り出す
($name, $value) = split(/=/, $pair);
# 変換演算子 tr + を スペースに置き換え
$value =~ tr/+/ /;
# 変換演算子 s/// 単語の構成文字にマッチ
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# " を " に変換
$value =~ s/"/"/g;
#\n を "" に変換
# $value =~ s/\n//g;
# 日本語に変換(デコード処理部分)
&jcode'convert(*value,'sjis');
&jcode'convert(*name,'sjis');
$FORM{$name} = $value; #※1
@num[$i]=$value; #※2
$i=$i++; #※2
}
※2:INPUTタグのvalueパラメータに入った値を上から順番に配列@num[0]…@num[データの数]で管理したい場合。
◆ライブラリの使用
ライブラリって図書館ですよね?Perlでは外部の実行ファイルやサブルーチンなどをrequire文で直接読み込むことが出来ます。実際に良く使う変数や配列を外部で分けて管理する方法もありますし、様々なサブルーチンを外部ファイルにして管理する方法もあります。ある程度分けていかないと、プログラムによっては以上に長いプログラムになってしまうのは容易に予想できます。図書館みたいなものです。URLエンコードされたデータをもとの日本語に変換するサブルーチンが既にあり、フリーでjcode.plと言うファイルが配布されています。当サイトでもjcode.plを用いてデコードしています。
ライブラリ呼び出し記述方法例:jcode.lpの場合
その他の場合は***.pl(***は任意)と差し替えてください。
require './jcode.pl'; #実行するファイルが同一フォルダ内にある場合
※『'』クォーテーションでファイル名を囲むのを忘れないように!!
□初級編 プログラミングに入る前に
第四章 Perlでよく用いられる記号たち | |
・変数・配列 | プログラミングって?変数と配列って? |
・演算子・比較演算子 | 演算子の紹介と文字化け |
・コメント・簡単な命令文 | コメントの重要性と命令文の種類 |
第五章 データを受け渡してみよう | |
・POSTとGET | フォームからのデータ受取 |
・デコード方法<< | デコードって?ライブラリの使用 |
・jcode.pl | jcode.plって何? |
・出力させてみよう | フォームを使ったデータを出力させてみる |
第六章 プログラムの中身って? | |
・繰り返し文 | for文、foreach文、while文の使い方 |
・条件分岐 | if文の使い方、パターンマッチについての説明 |
・サブルーチン | なにものだ?!利用方法を説明 |
・ファイルの入出力 | 外部ファイルの読み込み書き出しについて |
第七章 改造してみよう! | |
・文字や画像の差し替え | まずは簡単なところから |
・レイアウトの変更 | 駄目元でもいいからやってよう |
・やってはいけないこと、エチケット | 守ってね♪ |