Perlコーディング

fromオブジェクトのpostとget

2007年12月10日
fromに入力した値や、URLに引数として付加した値(クエリ情報と言うようです)は、どのような形で受け取れるのでしょうか。

PHPの場合、変数に値が代入されて渡ってきます。PHP5ならば、$_POSTや$_GETに配列として代入されています。
例えば、
<form method="post">
<input type="text" name="hensuu" value="">
<input type="submit" value="OK">
</form>
の場合、テキストに入力された値は、$hensuu(または$_POST['hensuu'])で参照できます。
$_POSTと$_GETが扱いづらければ、
extract($_POST);
で$_POSTの添え字を変数名とした変数にその値を入れてくれます。
例えば、$_POST['mode']='edit' なら、$mode='edit' となります。便利~


ところが、Perlはこのような機能はなく、自分で何とかしなければいけません。
$ENV{'REQUEST_METHOD'}に【POST】で渡ってきたのか、【GET】で渡ってきたのか入っています。
POSTの場合、read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); で$bufへ、
GETの場合、$buf = $ENV{'QUERY_STRING'};
で値を受け取れます。

受け取った値は、
hensuu1=value1&hensuu2=value2&・・・
の形式です。この値は、エンコードされているので、デコードします。
$char =~ tr/+/ /;
$char =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
($char =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1) )/eg; の方が一般的だとか。理由はまだ理解にいたらず・・)

まずは【&】で分解します。
hensuu1=value1
hensuu2=value2
 ・
 ・
 ・

次に【=】で分解します。
これを配列などに入れてやれば利用しやすくなります。
$in{'hensuu1'} = value1
$in{'hensuu2'} = value2

これでやっと変数名とその値が得られます。めんどくさっ。


探せばライブラリがどこかにあると思うのですが、サンプルで貰ったコードを利用させてもらってます。