フォームから渡された値の処理方法
フォームに入力された内容は「1番目のフォームの名前=その内容& 2番目のフォームの名前=その内容…」というように入力フォームに「NAME=」でつけた名前と その内容が「=」でつながれ、それが値を入力されたフォームの個数だけ「&」でつながれて渡される。 CGIで処理を行うには、一般的にこれらの内容を切り離す必要がある。また、空白は「+」、 漢字は16進数の漢字コードに変換されているので(URLにスペースや漢字を使えないため。) それらを元に戻す必要もある。

<FORM>タグのMETHODオプションはPOST(GETでも値の受け取りの部分が違うだけで、 切り離し方法は同じ)とすると、まず、
read(STDIN,$a,$ENV{'CONTENT_LENGTH'});
によって、渡された内容を$aという変数に読み込む。

例:渡された値がa=shinshu&b=daigaku&c=1であった場合、$aの内容は" a=shinshu&b=daigaku&c=1" となる。

それぞれのフォームの名前とその内容の組に分割するために、
@b=split(/&/,$a);
と記述する。splitは「/」で囲まれたパターン(文字)で「,」以降の文字列 (ここでは$aに代入されている内容)を切り分けて分けた内容を配列として返す関数である。 よって「フォームの名前=内容」という風に分割され、それぞれの内容が「@b」という配列の 要素として保存される。
例では「@b=("a=shinshu","b=daigaku","c=1")」と代入されたことになり、 $b[0]= "a=shinshu"、$b[1]="b=daigaku"、$b[2]="c=1"となる。

フォームの名前=内容というそれそれの@bの配列要素をフォームの名前をキー、 内容を要素とする連想配列に保存するため、
foreach $c (@b){
@d=split(/=/,$c);
$d[1]=~ s/\+/ /g;
$d[1]=~ s/%(..)/pack("c", hex($1))/ge;
$e{$d[0]}=$d[1];
とする。foreach 変数A(配列B){処理内容};という関数は配列Bの要素を次々に変数Aに代入し、 { }の中の処理を配列Bの要素の数だけ繰り返すものである。{ }内では、$cに代入された @bの要素を「=」という記号で分割して、結果を配列@dに保存する。その次の2行はフォーム の内容($d[1]に保存されている)で、スペースが「+」、日本語が16進数に変換されているのを、 それぞれスペースや、漢字に変換しなおすプログラム文になるが、今の時点ではこのように 書けばよいと考えるだけでよい。その@dの第1要素(フォームの名前)をキー、 第2要素(フォームの内容)を値とする連想配列%eを作る。

例では、まず配列@bの第1要素「"a=shinshu"」が$cに代入され、 { }内が実行される。
{ }内では、$cの内容「"a=shinshu"」が「=」で分割され結果が @dに代入される。よって$d[0]="a"、$d[1]="shinshu"となる。次の行で$e{"a"}="shinshu"; と連想配列%eに"a"をキー、"shinshu"が対応する内容として保存される。
その後、$cに"b=daigaku"、"c=1"が順番に代入されて、{ }内の処理が繰り返される。 結果として%eの内容は、
$e{"a"}="shinshu";
$e{"b"}="daigaku";
$e{"c"}=1;
となる。Perlでは1という値は、処理の内容によって数字(計算式の場合)、 文字(print文など)と自動的に判断されるので、特に指定する必要はない。