Устойчивое запоминание состояния
Пример 9-5. Устойчивое запоминание состояния
#!/usr/bin/perl -w
use CGI;
umask 0;
open(F,"/usr/dict/words") or die("He могу открыть! $!");
chdir("users") or die("He могу перейти в каталог $!");
# Это каталог, где будут храниться все данные
# о пользователе.
Soutput = new CGI;
if (not$output->param) {
print $output->header,
$output->start_html('Мой словарь');
print «HTML;
<FORM ACTION="read2.cgi" METHOD=POST>
<р>Введите свое имя пользователя:
<INPUT NAME="username" SIZE=30>
<P>
</formx/body></html> HTML
exit(0); }
$user = $output->param('username');
## Если файла пользователя нет, создать его и установить
## начальное значение в '0',
if ( not -e "$user" ) {
open (U, ">$user") or die("He могу открыть! $!");
print U "0\n";
close U;
&print_range('0');
## если пользователь существует и в URL не задано
## начальное значение, прочесть последнее значение и начать с него.
} elsif ( not $output->param('start') ) {
open(U,"Suser") or die("He могу открыть пользователя! $!");
$start = <U>; close U;
chomp $starl;
uprint range($start);
## Если пользователь существует и в URL не указано
## начальное значение, записать начальное значение
## в файл пользователя и начать вывод.
} else{
open(U,">$user") or die("He могу открыть пользователя для записи! $!");
print U $output->param('start'), "\n";
close U;
&print_range($output->param('start1)); }
sub print_range {
my $start = shift;
my $count = 0;
my $line = " "
print $output->header,
$output->start_html(' Мой словарь ');
print "<pre>\n";
while (($count < $start) and ($line = <F>)) { $count++; }
while (($count < $start+10) and ($line = <F>) )
{
print $line; $count++;
}
my $newnext = $start+10;
my $newprev = $start-10;
print "</pre><p>";
unless (Sstart == 0)
{
qq%<a href="read2.cgi?start=$newprev&username=$user">
Previous</a>%;
}
unless (eof) { print qq% <a href="read2.cgi?start=$newnext&username=$user">Next</a>%;
# Заметьте, что имя пользователя 'username' добавлено к URL.
# В противном случае CGI забудет, с каким пользователем имел дело.
}
print $output->end_html;
exit(0')