Cookieの値を取得する(CGI::Cookie) - Perl,CGI

すでに書き込まれた(セットされた)Cookieを取得するにはどうすれば良いだろうか?この機能もCGI::Cookieモジュールが簡単な方法を用意してくれている。

サンプル

#!/usr/bin/perl

;#
;#Cookieを取得する
;#

use CGI::Cookie;

#-- 全Cookieを取得 --#
my %cookies = fetch CGI::Cookie;

#-- Cookieの値を取得 --#
if(exists $cookies{'id1'}){
  $value   = $cookies{'id1'}->value;   #値
  $expires = $cookies{'id1'}->expires; #賞味期限
  $domain  = $cookies{'id1'}->domain;  #有効なドメイン
  $path    = $cookies{'id1'}->path;    #有効なパス
}

#-- 表示 --#
$|=1;
print "Content-type: text/plain\n\n";
print <<"END_OF_TXT";
        値:$value
  賞味期限:$expires
  ドメイン:$domain
      パス:$path
END_OF_TXT

実行例

        値:katsube
  賞味期限:
  ドメイン:
      パス:/

使用方法は非常に簡単である。 ポイントだけを押さえてシンプルに書くと、以下の3行だけで取得することが出来る。

use CGI::Cookie;
my %cookies = fetch CGI::Cookie;
my $value = $cookies{'id1'}->value if(exists $cookies{'id1'});

fetch CGI::Cookie;でハッシュ(連想配列)にCookieの値を入れる。その後は普通にハッシュを操作すればOK。キーとCookieの名前が同じになっている。keysvaluesなどで取り出すこともできるし、existsでCookieが渡されたかどうか確認することも可能。

ただ、$cookies{'key'}として取り出した値をそのままで使うことは難しいため、「値」「ドメイン」「賞味期限」「パス」などを取得するためのメソッドが用意されている。

メソッドを利用する上での注意点は2つ。
1つ目は、これらの値は例えば賞味期限などはブラウザが送信しないため取得されない場合がある。その場合は取得することはできない。実際に利用するのは「値」を取得するvalueメソッドだけではないか。

2つ目に存在しないCookie名を指定すると、致命的なエラーになってプログラムごと終了してしまうため、必ずexistsで存在を確認をするなどしてからメソッドを呼び出さなければならない。