CGIやホームページを制作していると、
クッキーを有効に活用したくなる場合があるだろう。
例えば掲示板などで連続した投稿を禁止するために、
クッキーに投稿時間を書き込むなどだ。
Perlで記述すると、こんな感じになると思う。
#Perlでクッキーに現在時刻を書き込むサブルーチン
sub setcookie
{
my ($sec,$min,$hour,$mday,$mon,$year2,$wday) = gmtime(time + クッキーの保存日数*24*60*60);
#現在時刻からクッキー保存日数経過日時を秒数にして、gmtimeの返り値にそれぞれ格納
my $timenow = time(); #現在時刻
$wday = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];
$mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon];
$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",$wday,$mday,$mon,$year2+1900,$hour,$min,$sec);
#曜日と月をクッキーの期日形式に変換 sprintfは指定した書式指定文字に変換する関数
print "Set-Cookie: クッキーに付ける任意のタイトル=$timenow; expires=$gmt\n";
}
当然ながら書き込んだクッキーは読み込まなければ意味がないので、
そのためのスクリプトは次のように記述すれば良いだろう。
#Perlでクッキーに書き込んだ内容を読み込むサブルーチン
sub getcookie
{
my ($getcookies,@pairs,$name,$value,%DUMMY);
$getcookies = $ENV{"HTTP_COOKIE"};
#HTTP_COOKIEはブラウザからクッキーを受け取る環境変数
@pairs = split(/;/, $getcookies);
#取得したクッキーを「;」で分解して配列に格納
foreach (@pairs)
{
($name, $value) = split(/=/);
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
$name =~ s/\s//g;
$DUMMY{$name} = $value;
}
#クッキーを格納した配列をforeachで一つずつ読み込みながら、読みやすい形に変換してさらにハッシュに格納している
$timenow = $DUMMY{"書き込む際に付けたクッキーのタイトル"});
#ハッシュのキーと書き込み時に付けたタイトルが一致するものを変数に格納している
}
もちろん、現在時刻でなくてもURLやパスワードなど自由に応用できる。
ただし、これはブラウザの設定でクッキーが有効になっていなければ機能しない。
そこで次回はブラウザの設定でクッキーを無効にしている場合の対処について考えてみよう。