職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

フォームデータの表示/perl

2018年03月08日 | perl
フォームデータの表示/perl

【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3 
Perlは既にインストール済み
CGIを使用する時は、必ずApachを起動する
参照サイト→フォームデータの表示

■フォームデータの表示(ブラウザ⇄サーバー)
・入力フォーム「form.html 」


・データ送信「form.cgi」して得られた結果


■スクリプト
1)フォーム「form.html 」


2)フォームデータ「form.cgi」


【解説】
・フォームの作り方
フォームはブラウザ側から Webサーバーにデータを送り出すためのもので、 <form ・・・ >~</form>の様にform タグを使って表す。
form タグには action 属性が必須です。
action 属性→起動するCGIファイルの URL を相対アドレスで指定します
method属性→送信するときの転送方法を指定する(getか、postか)

・コントロールの配置
form 要素の中に、テキストボックスやボタンなどいろいろなコントロールと呼ばれるものを配置する出来る。
<form>
データ1: <input type="text" name="data1"><br>
データ2: <input type="text" name="data2"><br>
好みの色:
<input type="radio" name="iro" value="red" checked> 赤
<input type="radio" name="iro" value="blue"> 青
<p><input type="submit" value="送信する"></p>
</form>

・入力コントロール<input>
1)<input type="text" name="data1">のtype属性には下図の通りある。ここではテキストボックスを使用する為、「text」を指定し、name 属性でテキストボックスの名前「data1」を付ける。


2)<input type="radio" name="iro" value="red" checked>
→value属性は送信される値を指定し、checkedは初期値で選択された状態にする

・フォームデータ「form.cgi」の解説
送信データ(入力フォーム→Webサーバ→フォームデータ)
form.html の画面から
データ1: 「ABC DEF」
データ2: 「日本」
好みの色: 「赤」
と入力したとすると、

送信されるデータは「data1=ABC+DEF&data2=%93%FA%96%7B&iro=red」となる。
但し、「&」は区切り文字、「+」は空白を示す
参考サイト→データ入力

#---- データ取得 ----
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else {
$buf = $ENV{'QUERY_STRING'};
}
意味
→若し、環境変数 'REQUEST_METHOD' の値が 'POST' なら {
環境変数 'CONTENT_LENGTH' にセットされたデータの長さの文字列を、標準入力STDIN から変数 $buf に読込め。
} 環境変数 'REQUEST_METHOD' の値が 'POST' 以外なら {
環境変数 'QUERY_STRING' にセットされた文字列を、変数 $buf に代入せよ。
}
・ post の場合のSTDINとは画面からの入力の事で、Webサーバーは、ファイルハンドル STDIN を使ってフォームから入力されたデータをread 関数で読み取ることができるようにする。
変数$bufには、「data1=ABC+DEF&data2=%93%FA%96%7B&iro=red」が読み込まれる。

・文字列を分割する
つまり、data1=ABC+DEF&data2=%93%FA%96%7B&iro=redを&で分割する
@data = split(/&/, $buf);
foreach (@data) {
($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$in{$key} = $val;
}
@data = split(/&/, $buf);
→ split 関数の第1引数/&/ は 「デリミタ」 と呼ばれるもので、$bufのデータを「&」で分割する。よって、配列 @data に、次のようにデータが格納される。
$data[0] = "data1=ABC+DEF"
$data[1] = "data2=%93%FA%96%7B"
$data[2] = " iro=red"

・ foreach ループ
foreach (@data){}が実行する都度、配列 @data の各要素が $_ に代入され、次のスクリプト($key, $val) = split(/=/);で、 $_ に代入された文字列を 「= 」 という 「区切り文字」 の前後に分割して、$key と $val に代入しています。

なお、split(/=/)→第2引数を省略した場合には、Perlのグローバル変数$_ が用いられる。

・変換演算子tr///
$val =~ tr/+/ /; →$val に代入されている文字列の中に、「+ 」 という文字があれば、これをスペースに変換する命令。例えば、ブラウザから "ABC+DEF" という文字列を送られたら、"ABC DEF" に変換するというもの。書式→$x =~ tr/変換対象の文字リスト/変換する文字リスト/;

・正規表現とは
ある特定の文字列ではなく、文字列の一部をパターン化して表現する手法をいいます。Perlでは、パターンマッチ演算子として、スラッシュ ( /パターン/ ) で囲んだ文字列が正規表現であるとされ、性格上、正規表現は条件式と併用して用いられることが多い。→パターンマッチ演算子

・置換演算子 s///
書式(s/パターン/置換文字列/修飾子)で、修飾子は特別な置換方法を指定する場合にのみ使用する。
$val =~s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
→/%([0-9a-fA-F][0-9a-fA-F])/ の部分はマッチ演算子で、%を取り除いた英数字と照合させ、一致した値を変数$1に入る。

→/chr(hex($1))/ は$1 に代入された文字列を加工している。 hex 関数は渡された引数を16進数の文字列と認識して10進数に変換する関数。chr関数は引数として渡された文字コードに対応した文字を返す関数。

→/eg;に関して説明すると、修飾子eは置換文字列として書いてある部分、この場合の chr(hex($1)) を、文字列としてではなく関数や式として評価することを指示。
修飾子g は、1つだけではなくマッチしたすべてを置換するという指定。

・フォームデータの整理、出力
→$in{$key} = $val;はフォームデータからハッシュ %in (連想配列)を生成する為の命令。
即ち、この foreach ループは3回まわりますが、その都度 'data1' というキーに対して 'ADC DEF' というような値を持つハッシュ、'data2' というキーに対して '日本' というような値を持つハッシュ、 'iro' というキーに対して 'red' というような値を持つハッシュが生成される。

→foreach (sort keys %in) {print qq($_: $in{$_}\n);} は、このハッシュ %in の内容を出力するための処理。
keys %in はハッシュ%in のキーだけを取り出した配列。(sort keys %in)はsort関数を使って配列キーをソートしている。従って、ここの処理は1回まわる度に、ソートされたキーの配列から1つずつキーが取り出され、それを $_ に代入し、{print qq($_: $in{$_}\n);} で キー:値を出力している。
なお、qq()は ダブルクォート演算子





コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« perlの環境変数について | トップ | シンプルなアンケートを作る »
最新の画像もっと見る

コメントを投稿

perl」カテゴリの最新記事