掲示板の入力フォームから送信されたデータは、「%」に続く英数字で表される符合に変換される(URLエンコード)ため、符号化された文字列を元の状態にした上で、適切な文字コードに変換する必要があります。ここでは、符号化された文字列をブラウザ上に正しく表示するためのプログラムを作成する方法について考えてみましょう。
エディタで「libraly.pl」を開きます。送信されてきたデータは、エンコード処理されているため、これをデコード(元の状態に戻す)し、さらに漢字コードを統一します。
sub do_read {
#POSTメソッドでデータが送信された場合の処理
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $temp, $ENV{'CONTENT_LENGTH'});
}
#GETメソッドでデータが送信された場合の処理
else {
$temp = $ENV{'QUERY_STRING'};
}
#取得したデータを項目ごとに分解して配列変数に格納
@answers = split(/&/, $temp);受け取ったデータにHTMLタグやプログラムに支障がある文字列を変換し、処理後のデータを連想配列に格納します。
foreach (@answers) {
#項目名と値を分割
($key, $value) = split(/=/, $_);#受け取ったデータをデコードする
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;# 文字コードをEUCに変換する
&jcode'convert(*value,'euc');# HTMLタグとプログラムに支障がある文字を無効にする
$value =~ s/&/&/g;
$value =~ s/,/,/g;
$value =~ s/\"/"/g;
$value =~ s/</</g;
$value =~ s/>/>/g;# 削除するメッセージのNoを変数に格納する
if ($key eq 'delete_no') { push(@DELETE,$value); }$ANSWER{$key} = $value;
}連想配列とは、複数のデータを格納できる特殊な変数のことで、格納するそれぞれのデータに名前をつけておくことができます。
前の操作で作成した連想配列「answer」から項目ごとに値を取り出して、それぞれ変数に格納します。これによって、変数名を指定して目的の値を取り出すことができるようになります。
#入力されたデータを変数に格納する
$command = $ANSWER{'command'}; #識別モード
$name = $ANSWER{'name'}; #投稿者の名前
$email = $ANSWER{'email'}; #メールアドレス
$sub = $ANSWER{'sub'}; #題名
$url = $ANSWER{'url'}; #URL
$url =~ s/http\:\/\///g; #URLの「http:」の文字列を削除
$do = $ANSWER{'do'};$comment = $ANSWER{'comment'}; #コメント
$comment =~ s/\r\n/<br>/g; #コメント内の改行をHTMLタグに変換
$comment =~ s/\r/<br>/g;
$comment =~ s/\n/<br>/g;}
内容を変更したプログラムの保存を行います。
Perlでは、特定の処理を行うプログラムは、サブルーチンとしてまとめて記述しておくと、サブルーチンを使って必要な処理を行わせることができます。サブルーチンは「sub(サブルーチン名){プログラムコード}」のように記述します。
例では、送信されたデータのエンコードと文字コードの変換を行って各変数に格納するプログラムを「do_read」というサブルーチンとして登録しています。例では、掲示板のフォームを使って送信されたデータは、「name=Shirley」のように「データ名=値」の形式でユーザー名をはじめメールアドレスやコメントなどの情報が「&」記号でつながれて送信されてきます。このため、一旦「&」の箇所でデータを分割して配列変数に格納し、さらに「=」の箇所でデータ名と値を分割して、それぞれ変数に代入しています。これによって、変数「$value」に格納された値だけを取り出してデコード処理を行い、続いて文字コードの変換を行うことができます。
配列変数とは、複数の値を保存することができる変数で、代入した値に対し、キーと呼ばれる名前を設定しておくことができます。このとき、1つのキーに対して1つの値だけを設定することができ、キー名を指定することで特定の値だけを連想配列の中から取り出すことができます。