CookieのVALUEの文法を考えてみます。
あ、その前にNAMEを何にするかを決めておかないといけませんね。まあ、ここは手堅く「jinro」で良いでしょう。
jinro=[key]:[value],[key]:[value],〜,[key]:[value]
上記のように、VALUEの部分にkey とvalue を複数埋め込む感じにしようと思っています。
key とvalue は「:」で区切り、それぞれの対は「,」で区切ることにします。注意点としては、key にもvalue にも「:」「,」はもちろん「=」「;」といった文字を含めてはいけないということでしょうか。
(本当は「=」は微妙ですが。入っていても良いのかも)
まあ、Cookie に格納するデータはCGI側でコントロールすることになるので、特殊文字を含めないように気をつける事は可能だと思っています。(悪意あるCookie の書き換えにどう対処するかは別問題)
さて、そうするとCookie の読み込みのサブルーチンは以下のようになるかと思います。
sub STDIN_COOKIE { $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/, $cookies); foreach $pair (@pairs) { local($name, $value) = split(/=/, $pair); $name =~ s/\s//g; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; $tmp{ $name } = $value; } @pairs = split(/,/, $tmp{'jinro'}); foreach $pair (@pairs) { local($name, $value) = split(/:/, $pair); &jcode'convert(*value,'euc'); $Cookie_Tbl{ $name } = $value; } }
まず、Cookie の文字列を「;」で区切り、それぞれのトークンを更に「=」で区切ってNAMEとVALUEを取り出します。取り出したNAME と VALUE のセットはとりあえずtmp という連想配列に入れておきます。このとき、VALUE についてはURL Encoding されているはずなので、Decode してから格納します。
次に、NAME が「jinro」であるVALUE だけを取り出し、それを「,」で区切ってpairs という配列に格納します。最後にそれぞれのpairs についてそれを「:」で区切り、key と value に分けてCookie_Tbl という連想配列に格納します。このとき、value については文字コードをEUCに変換しておきます。
以上の処理で、Cookie にセットされているデータを取り出すことが出来るようになります。
次は、Cookie にデータをセットする方法を見ることにしたいと思っています。