掲示板などで二度目に訪問した際に前回入力したデータ(名前/住所)があらかじめフォームに入っている場合があります。これはクッキー(Cookie)という仕組みを使って、ユーザーのパソコンに書き込み情報を保存しておき、次に訪問した時にその情報を読みこみでフォームに表示させています。クッキーの書式は次のとおりです。クッキに覚えさせるデータ部分です。クッキー名は自由につけてかまいません。覚えさせたクッキーを呼び出す際には、このクッキー名を使います。=の後に覚えさせたい値を書きます。クッキー名と値の区切り文字は=ですので、値の中に=を使うことはありません。クッキーの有効期限を指定します。指定した有効期限がくるとそのクッキーは無効とみなされ保存されなくなります。時:分:秒時間帯で、次のようになります。曜日の部分はMON、Wedのように省略形で書いてもかまいません。このクッキーを発行したサーバーのドメイン名を指定します。省略すると自動で名前が入ります。このクッキーが有効なURLパスの範囲を指定します。省略すると値は/mになり、そのサイト全体で有効になります。http://aaa.bbb.com/ddd/でdomain="/"とすると、http://aaa.bbb.com/内でこのクッキーは有効となります。サーバーとの接続がセキュアであるときのみクッキーが送信されます。CGIでHTMLを表示する場合、Content-type:text/htmlヘッダの後に次の文を追加します。クッキーを作成する流れは次のとおり。書く変数名=値という文字列を作ります。この例では名前、メールアドレス、色番号の3種類です。次のこの3つをEnc_Sep_Codeという文字で接続します。ここのポイントはつなぐ記号は=ではなく、Enc_Sep_Codeという文字列であるという点です。$C_line=join('Enc_Sep_Code',$c_name,$c_main,$c_color);3=,と;記号をEnc_Ea_CodeとEnc_Colon_Codeに変換します。=はクッキー名=値の区切り文字ですので、値の中では使用しません。;は次のexpireとの区切り文字ですのでこちらも別の文字列に変換しておきます。s/=/Enc_Eq_Code/g;#=をEnc_Eq_Codeに変換する。s/=/Enc_Colon_Code/g;#;をEnc_Colon_Codeに変換4クッキー名=値;expires=有効期限という文字列を作成します。'jcode.pl';$CgiURL='cookie.cgi';#フォームから入力された値を得ます。#色番号を色名に変換する}####クッキー文字列の作成#変数名=値という文字列を作る$c_name="name=$name";$c_mail="mail=$mail";$c_color="color=$color";#各文字列をEnc_Sep_Codeという文字列でつなぐ$c_line=join('Enc_Sep_Code',$c_name,$c_mail,$c_color);#$c_lineに含まれる=,と;記号を別の文字列に変換する。value="クッキーをセットします"></td></tr></table></form>次のCOOKIEがSETされました。CGI以外のページを閲覧した場合でも、クッキーを記憶させたい場合にはmetaタグを使います。metaタグの書式はヘッダー名にSet-Cookieを、値にクッキー文字列を書きます。HTMLにmetaタグを使ってクッキーを記憶させる場合は常に同じ値しか与えることができません。JavaScriptを使うことで訪問時間など、動的にデータを記憶させることができるようになります。書式は、値の部分にクッキー文字列を書きます。visit_time:訪問時間というクッキーを記憶させます。ユーザーがCGIにアクセスすると、そのパス(URL)で有効なクッキーがサーバーに送信されます。送信されたクッキーは環境変数$ENV{'HTTP_COOKIE'}から取り出すことができます。ひとつのサイトにいくつものクッキーがセットされている場合があるため、まずすべての有効なクッキーを次のようなハッシュにいれます。各クッキーは、;区切りで$ENV{'HTTP_COOKIE'}に入ってますので次のようにまず;で分割し、@pairs配列にいれます。クッキーはクッキー名=値という形式であるためクッキー名と値に分割します。クッキーに保存したときに=をEnc_Eq_Codeに変換したのでそれを元に戻します。$COOKIES{クッキー名}に値を代入します。次に%COOKIESハッシュから必要な値を取り出します。この例ではクッキー名は'cookietest'であるため、必要な値は$COOKIES{'cookietest'}に入っています。クッキーの値は次のようになっています。nameEnc_Eq_Code名前Enc_Sep_CodemailEnc_Eq_CodeメールアドレスEnc_Sep_CodecolorEnc_Eq_Code色番号もし名前に;が使われていればEnc_Colon_Codeに変換されています。$COOKIES{'cookietest'}をEnq_Sep_Codeで切り分けて、それぞれの変数名=値ごとに処理を行います。$COOKIE{'name'}に名前、$COOKIE{'mail'}にメールアドレス、$COOKIE{'color'}に色番号が入ります。次のプログラムは入力されたデータをクッキーにセットし、現在のクッキーを表示します。リロードすると前にセットしたクッキーが表示されます。6.CGI::Cookieモジュール6-1.CGI::Cookieモジュールで値の設定CGI::Cookieを使うと、簡単にクッキーの値を設定することができます。JST');次の要素を指定します。CGI::Cookieでセットされたクッキー文字列を次のようにクッキー名をキーにしたハッシュとして得ることができます。CGI::Cookie;$cookie=$cookies{'test'};$cookieからvalueの値だけを取り出すには次のようにします。$cookie->{'value'}->[0];次の文はアクセスした時間をセットするプログラムです。NewValueがクッキーにセットされる値、NowValueが前回クッキーにセットされた値です。CGI::Cookie;$time=time;#クッキーの値を取り出す。クッキーの値をセットする-valueに[]で囲んだリストを渡すと、それらの値が、&区切りでセットされます。リピータ調査などの目的でサイト全体のページ用のクッキーを設定しているとき、それとは別に掲示板用のクッキーを使いたい場合はそれらを別々のクッキーとして保存します。複数のクッキーを保存させるには複数のクッキー文字列を作成して、それぞれにSet-Cookieを行います。'jcode.pl';#クッキーの値を取り出す。$NewCookie3<br><br></body></html>IOexit;#[CODE-SAMPLE]$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$6-5.HEADERにCOOKIEをSETCGIモジュールを使ってCOOKIEの値をヘッダーにセットにします。次のようにオプションに指定します。$ctime<br></body></html>IOexit;#[CODE-SAMPLE]$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$6-6.設定された環境変数一覧を表示CGI環境変数を得るには%ENVの内容をブラウザに表示させます。ブラウザに表示させるには次の文で%ENVのキーをすべて得て値を表示させます。<<"IO";</table></body></html>IOexit;#[CODE-SAMPLE]$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$。