□Perl 講座 初級編 > デコード方法

◆デコード?

ブラウザや外部ファイルからのデータと、CGIスクリプトとの間でやり取りする場合(殆どがこのケースだと思います)、ENCTYPEを[multipart/formdata]としない限りそれらのデータはURL形式にエンコードされてやり取りされます。ですから、CGIスクリプト上で計算や判別させるために、元の形に復元させてから出ないといけません。復元することをデコードするって思ってもらっていいと思います。逆にエンコードとはデータをやり取りするために暗号化することってこの場では認識すると良いでしょう。

では、実際にどうやってそれをデコードしたらいいか、例で上げておきます・・・。
内容をこの時点で深く考えなくても、まだ現時点では良いですよ♪少し内容がわかる人は、コピーアンドペーストして活用してみても良いでしょう( ´Д`)b

#デコードするためのプログラム

# プラウザからのデータ取込み
if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
    $buffer = $ENV{'QUERY_STRING'};
}

# プラウザからのデータ変換
$i = 0; #※2
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
    #1行毎に$name,$valueを取り出す
    ($name, $value) = split(/=/, $pair);
    # 変換演算子 tr + を スペースに置き換え
    $value =~ tr/+/ /;
    # 変換演算子 s/// 単語の構成文字にマッチ
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

    # " を " に変換
    $value =~ s/"/"/g;
    #\n を "" に変換
    # $value =~ s/\n//g;

    # 日本語に変換(デコード処理部分)
    &jcode'convert(*value,'sjis');
    &jcode'convert(*name,'sjis');
    $FORM{$name} = $value;    #※1
    @num[$i]=$value;    #※2
    $i=$i++;    #※2
}
※1:INPUTタグ内のnameパラメータにセットした値とvalueパラメータにセットした値に関連をもたせたい場合。
※2:INPUTタグのvalueパラメータに入った値を上から順番に配列@num[0]…@num[データの数]で管理したい場合。



◆ライブラリの使用

ライブラリって図書館ですよね?Perlでは外部の実行ファイルやサブルーチンなどをrequire文で直接読み込むことが出来ます。実際に良く使う変数や配列を外部で分けて管理する方法もありますし、様々なサブルーチンを外部ファイルにして管理する方法もあります。ある程度分けていかないと、プログラムによっては以上に長いプログラムになってしまうのは容易に予想できます。図書館みたいなものです。

URLエンコードされたデータをもとの日本語に変換するサブルーチンが既にあり、フリーでjcode.plと言うファイルが配布されています。当サイトでもjcode.plを用いてデコードしています。

ライブラリ呼び出し記述方法例:jcode.lpの場合
その他の場合は***.pl(***は任意)と差し替えてください。

require './jcode.pl'; #実行するファイルが同一フォルダ内にある場合

※『'』クォーテーションでファイル名を囲むのを忘れないように!!

□初級編 プログラミングに入る前に