ここでは、複数のパラメータの取得方法と特殊コード(%a2のように%で始まる16進コード)の扱い方について学習します。
前項では、CGI起動時に一つのパラメータしか受け取りませんでした。
複数のパラメータを一度に取得したい場合どのようにすればいいのでしょうか?
<GET>
<POST>
ここでも、このページのHTMLソースコードを覗いてください。
前項と同じように、<FORM action="tst_para.cgi">と<FORM
method="POST" action="tst_para.cgi">の2つのFORMタグがありますね。
tst_para.cgiは前項とまったく同じプログラムです、実行を押してみてください。
GETの実験結果は入力文字を変更しなければ下記のように出力されたはずです。
get_txt1=GET%82%CC%8E%C0%8C%B1%81%7C%82P&get_txt2=GET%82%CC%8E%C0%8C%B1%81%7C%82Q
この結果から想像できると思いますが、取得されるパラメータの書式は
パラメータ名1=パラメータ値1&パラメータ名2=パラメータ値2&パラメータ名3=パラメータ値3・・・・・
のようになります。
CGIプログラムではこの書式から、各種パラメータの振り分けをおこないます。
パラメータを振り分け、コードを日本語に変換するプログラムを提示します。
HTMLのソースコードを見てもらえれば分かりますが、methodは定義されていないのでGETです。
また、CGIプログラム名はtst_para2.cgiで、名前はtext1とtext2です。
実行されるプログラムの内容(tst_para2.cgi) | |
#!/usr/local/bin/perl5 #パラメータの取得 $buffer = $ENV{'QUERY_STRING'}; @para = split(/&/,$buffer); ($name1, $value1) = split(/=/, $para[0]); ($name2, $value2) = split(/=/, $para[1]); $value1 =~ tr/+/ /; $value1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value2 =~ tr/+/ /; $value2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>パラメータの取得</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "$name1......$value1<BR>\n"; print "$name2......$value2<BR>\n"; print "</BODY>\n"; print "</HTML>\n"; |
METHODがGETなので環境変数からパラメータを読み込む 全体のパラメータの分解(パラメータは&で区切られてくる) 1つ目のパラメータ(text1)を名前と値に分解(=で区切られてくる) 2つ目のパラメータ(text2)を名前と値に分解 変換規則で+はブランクに置き換える %XXを16進コードに変換している 2つ目のパラメータにも同様の処理を行う |
実行結果を見てください。
パラメータ名とパラメータ値がきれいに表示されているのが分かりますね。
上記プログラムでは、初めて使う組み込み関数(Perlが最初から持っているプログラム)が使われているので解説します。
$value1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
赤色の正規表現では「%9a」や「%08」などの16進定義を表しています。
$value1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
正規表現と一致した文字列をpack("C", hex($1))で置き換えています。
$1はパターンマッチした文字列が格納さます。
hex( )は16進文字列を数値に変換する組み込み関数です。
pack("C",数値)は数値を変数に詰めていく組み込み関数です。
今回の場合%で始まる16進数の文字列を数値に変換して$value1へ詰めていく操作をしています。