Теневые посылки и любимы, и ненавидимы. Многие пользователи терпеть не могут, когда на их компьютерах сохраняются мегабайты информации подобного рода. Поскольку теневые посылки позволяют отслеживать передвижение пользователей по разделам, а также делать заказы при помощи "Магазинной карты", то тёплые чувства к теневым посылкам всё же преобладают над раздражением.
От введения перейдём к реализации. Записать теневую посылку с помощью CGI.pm несложно. В нашем примере она будет носить имя "greetings" и хранить информацию в хэше %greetings, уничтожая её по истечении года.
$co= new CGI;
$greetingcookie= $co->cookie(
-name=>'greetings',
-value=>\%gretings,
-expires=>'+365d');
print $co->header(-cookie=>$greetingcookie);
Заметьте, что для создания теневой посылки вы передаёте её в качестве
именованого параметра CGI-методу header.
Для чтения теневой посылки используется обычный CGI-метод, получающий в качестве параметра имя посылки. После этой операции можно использовать данные хэша %greetings:
$co=new CGI;
%greetings=$co->cookie('greeting');
print $greetings{'name'};
Вот и вся работа с теневыми посылками. Но имейте ввиду, что многие
пользователи не желают, чтобы программы хранили какие-либо данные на их
машинах!
Далее приведу вам программу, которая позволяет приветствовать посетителя по
имени, а в день его рождения и поздравлять. Этот сценарий вполне корректен -
он не устанавливает никаких теневых посылок до тех пор, пока пользователь
сам не предоставит или не обновит необходимую информацию.
#!/usr/bin/perl
use CGI;
$co=new CGI;
%greetings=$co->cookie('greeting');
if ($co->param('name')){$greetings{'name'}=$co->param('name');}
if ($co->param('birthday')=~ m/\d\d\/\d\d/){
$greetings{'birthday'}=$co->param('birthday');}
($day, $month, $year)=(localtime)[3,4,5];
$date=join("/",$month.+1, $day);
if (exists($greetings{name})){
$greetingstring='Hello, '.$greetings{name};
if ($date eq $greetings{birthday}){$greetingstring.=", happy birthday!";}
else{$greetingstring.="!";}
$greetingsstring=~ s/</&lt/;
$promt="Если вы хотите изменить установки страницы, то
всего-лишь введите новые данные.";}
else{$promt="Для того, чтобы скрипт вас в следующий раз поприветствовал,
введите нужные данные:";}
$greetingcookie=$co->cookie(
-name=>'greeting',
-value=>\%greetings,
-expires=>'+365d');
if ($co->param('name') || $co->param('birthday')){
print $co->header(-cookie=>$greetingcookie);}
else {
print $co->header;}
print
$co->start_html(),
$co->center(
$co->h1("Cookie Example"),
$co->p,
$co->h1("$greetingstring"),
$promt,
$co->startform,
'Ваше имя: ',
$co->textfield(
-name=>'name',
-value=>'',
-override=>1),
$co->p,
'День рождения(mm/dd): ',
$co->textfield(
-name=>'birthday',
-value=>'',
-override=>1),
$co->p,
$co->submit(-value=>' Ок '),
$co->reset,
$co->endform),
$co->end_html;
Пример работы программы:Посмотреть

