# URLエンコード
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =‾ tr/+/ /;
$value =‾ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
フォームから送られたデータは「変数名1=データ1&変数名2=データ2&...」
@pairsへ &デリミタで"変数名1=データ1"、"変数名2=データ2" 等を格納
foreach で @pairs から $pair へ "変数名1=データ1" をsplitで、変数名1とデータ1を取り出す
「URLエンコード」は
A〜Z、a〜z、0〜9、* - . @ _ はそのまま、半角スペースは + に変換。
その他はすべて % に16進の2桁の文字コード(「あ」0x2422なら %24%22)
デコード $value =‾ tr/+/ /;は「+」を半角スペースに戻す(trは、変換演算子で、正規表現が使えない)
$value =‾ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; は、
%([a-fA-F0-9][a-fA-F0-9])を、hex関数で10進数にし、pack関数でその数値を文字に変換
g指定で$value全体に適用、e指定はpack("C", hex($1))を式として評価した結果を対象にする
----------------------------------------------------