パラメータの取得
いよいよ、Perl/CGIプログラム本体をコーディングしていきます。
まずは、HTML入力フォームからデータを受け取って表示させてみます。
サンプル
前の段階で作成しました3種類のHTMLフォームから、入力データを受け取って表示させています。
Shift_Jisコードの入力フォーム。
EUCコードの入力フォーム。
UTF-8コードの入力フォーム。
実際にデータを入力し送信ボタンを押してみてください。
各name属性で決めた文字列をキーとし…。
それに対応するような形で、入力値が表示されていますよね。
さらに、3種類の文字コードのHTML入力フォームからのアクセスに対しても、文字化けすることなく表示されています。
でもまだ入力チェックや、お問い合わせ内容の文字列に対して改行処理などはしていませんから、入力内容によっては表示が崩れます。
<戻る>
ダウンロード
サンプルプログラムをダウンロードするにはここをクリックします。
ZIP形式で圧縮されているので解凍作業が必要です。
改行コードはWindows形式です。
文字コードは、Perl/CGIプログラム本体およびシフトジスバージョンの入力フォームとthanks.htmlはShift_Jisコードです。
もちろんEUCバージョンの入力フォームはEUC、UTF-8バージョンの入力フォームはUTF-8コードになっています。
解説
ここでは、HTMLフォームから入力されたデータを受け取り、キーと値に整理し表示させています。
paramパッケージ内のget関数でパラメータを取得します。
あとは、whileループを使って、取得したパラメータのキーと値のペアをすべて表示させています。
get関数
get関数はparamパッケージ内にあるので、「¶m::get」として呼び出します。
さらに、paramパッケージは「param.pl」内にあるので、「require "param.pl";」として、あらかじめ取り込んでおく必要があります。
もっと言うなら、「param.pl」は、「lib」フォルダ内にあるので、「use lib lib;」として「lib」フォルダを参照するように指定しておく必要があります。
get関数は、パラメータを取得し、キーと値のペアを作成します。
引数はなしで、戻り値はパラメータとして受け取ったキーと値のペアを連想配列形式にしたリファレンスです。
get関数の流れ
get関数は、CGIモジュールを使ってパラメータを取得しています。
さらに、取得した値つまり、入力文字列の文字コードを調べ、Perl/CGIプログラム本体と同じ文字コードであるShift_Jisに変換します。
文字コードの判定や変換には、Jcodeモジュールを使っています。
そうして作ったキーと値のペアを、連想配列に格納しリファレンス形式で返します。
CGIモジュールを使う準備
CGIモジュール本体は、「lib」フォルダ内の「CGI」フォルダと、「CGI.pm」ファイルです。
まずは、「use CGI;」でCGIモジュールを使うことを宣言し…。
続いて、「my $CGI = new CGI;」で、CGIモジュールの機能を使う際は「$CGI」を窓口にすることを指定します。
これで、CGIモジュールを使う準備が整いました。
Jcodeモジュールを使う準備
Jcodeモジュール本体は、「lib」フォルダ内の「Jcode」フォルダと、「Jcode.pm」ファイルです。
プログラム内で利用するためには、「use Jcode;」と宣言するだけで使えます。
パラメータキーの取得
まずは、パラメータの中でもキーに指定されている文字列を取得します。
HTML入力フォームで指定しましたname属性の文字列のことですね。
「my @params = $CGI->param();」とすることで…。
配列「@params」には、「name」や「email」「message」といった文字列が格納されます。
パラメータ値の取得
次に、入力された値を取得します。
すでに取得済みのキーを手がかりに、入力された文字列を取得していきます。
foreach (@params) {
$input{$_} = $CGI->param($_);
$joined_value .= $input{$_};
}
foreachループを使って、「@params」内のキーの数ぶんだけ値を読み込む処理をします。
ここでは、「name」「email」「message」といったキーは、「$_」になっています。
そしてこれらキーの文字列を使って、それぞれの値を取得していきます。
「$CGI->param($_);」というのがそうですね。
ここでは、連想配列「%input」に順次格納しています。
もし、氏名入力欄に入力された値のみをピンポイントで取得したい場合は次のように記述します。
「$name = $CGI->param('name');」。
氏名入力欄のキーつまり、name属性で指定した文字列は「name」ですから…。
「$CGI->param('name')」。
となるわけですね。
これで、変数「$name」に氏名入力欄に入力された値が格納されます。
foreachループ内でのもうひとつの処理…。
「$joined_value .= $input{$_};」については、ただキーを無視して値のみをつなげているだけです。
この後、変数「$joined_value」に格納されたすべての入力値から、文字コードを判定します。
文字コード判定
次に、どの文字コードで入力値が送信されてきたかを判断します。
「$charset = &Jcode::getcode($joined_value);」という部分がそうですね。
変数「$charset」には、文字コード名が格納されます。
前の段階でも少し書きましたが、HTMLフォームから文字コード名も一緒に送信していた場合には、このプロセスは必要ありませんね。
もしスピードを重視する場合には、文字コード名も送るようにし、このプロセスをスキップさせたほうが早くなります。
文字コード変換
それでは、連想配列に格納された値を一つ一つ呼び出して、文字コードを変換していきます。
foreach my $value (values (%input)) {
&Jcode::convert(\$value, "sjis", $charset);
}
連想配列「%input」のキーは無視し、値のみを変数「$value」にひとつずつ取り出しています。
そして、「&Jcode::convert(\$value, "sjis", $charset);」で順番にShift_Jisコードに変換していきます。
戻り値
戻り値は当然、リファレンス形式の連想配列「%input」ですね。
「return \%input;」でキーと値のペアが返されます。
メイン処理
メイン処理では、get関数からの戻り値を「$param」に格納しています。
「$param」は、見た目は単純変数ですが、前述したように中身は、リファレンス形式の連想配列ですから、whileループでキーと値を順次呼び出していきます。
while (my($key, $value) = each %{$param}) {
print $key, " = ", $value, "<br>\n";
}
以上です。
<戻る>