cookie

クッキーでは、ブラウザに情報を送ってユーザーを判別することができます。
そのためには、HTTPヘッダを利用します。

基本的には、クッキーを送るにはこのように書けばOKです。

print "Content-Type: text/html\n"
print "Set-cookie: キー名=値; expires=有効期限(GMT)\n\n;"

さて、早速一つずつ見てきましょう。
まず、Set-cookieで、クッキーを送ります。

Set-cookie: キー名=値

キー名というのは、クッキーに保存されているデータの変数名、
値はその中に保持される値です。
このキー名=値で、サーバーは読み取りするかどうか判別します。

expires = 有効期限(GMT)\n\n;"

有効期限は省略可能ではありますが、設定しないとwebブラウザが
終了させるたびにクッキーはリセットされてしまいます。
expiresを指定するための、有効期限の作成は以下を使用します。

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
= gmtime(time + 有効期限)

@day = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
@month	= ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug",
"Sep","Oct","Nov","Dec");
$expireDate = sprintf("%s\, %02d\-%s\-%04d%02d:%02d:%02d GMT", 
$day[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec);

この「有効期限」という部分には、日数を入れます。
たとえば30日だったら、60*60*24*30となります。


それでは、個人別訪問カウンターを作ってみます。

my $cookie = $ENV{'HTTP_COOKIE'};#クッキーを受け取る
my @array = split(/; /,$cookie);


#複数のクッキーがある場合は取得して分離
foreach $tmp (@array) {
	my($key, $value) = split(/=/, $tmp);
	if($key eq 'count'){
		$count = $value;
	}
}


if($count == ''){
	$count = 0;
}
$count++;


#クッキーの有効期限(30日間)
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
 = gmtime(time + 60*60*24*30);

@day 	= ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
@month	= ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep",
"Oct","Nov","Dec");
#有効期限
$expireDate = sprintf("%s\, %02d\-%s\-%04d%02d:%02d:%02d GMT", 
$day[$wday],
$mday,
$month[$mon],
$year+1900,
$hour,
$min,
$sec
);

これがクッキーのための大まかな流れです。
表示部分は、

print "Content-type: text/html\n";
print "Set-cookie: count = $count; expires = $expireDate\n\n";

my $body = << "END_OF_HTML";

counter

個人別カウンター

あなたは$count回目のご訪問です。



END_OF_HTML

print $body;

こんな感じです。
これで、訪問者別にカウンターが回るようになりました。