IZONE - http://www.izcity.com/ - бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

 IZONE 


Perl для веб-мастера-5

Евгений ГРИВАСТОВ (tw@tv-gent.net)

(Продолжение. Начало в IZone 84, 97)

В предыдущих статьях этого цикла вы уже опробовали основные приемы программирования на Perl и познакомились с синтаксисом и способами использования основных операторов этого языка. Так, вы знаете, что если параметры вызова скрипта передаются после знака вопроса в URL, то получить строку параметров можно из переменной окружения $env{'query_string'}. У вас в арсенале есть небольшая стандартная подпрограмма, преобразующая данные, полученные из html-формы в обычный хэш. Научились основным приемам в работе с текстовыми файлами, получению других основных переменных окружения, рассмотрели основные операторы циклов и операции сравнения, немного познакомились с регулярными выражениями. На этот раз давайте сделаем скрипты модерации записей в нашей гостевой книге.

Модерация гостевой книги
Для этого нам понадобится два скрипта: один будет показывать, какие записи присутствуют в нашей гостевой книге, а второй - вносить в них изменения. Первый сделаем на основе скрипта просмотра записей гостевой книги (изготовленного нами в прошлый раз). Скопируйте содержимое файла showgb.cgi в новый файл с именем showgbm.cgi. Теперь немного изменим наш showgbm.cgi (изменения будут прокомментированы по ходу листинга):
#!/usr/local/bin/perl

 $gbid=$ENV{'QUERY_STRING'};
 ($gbid,$numzap)=split(/&/,$gbid);
 $dir='/home2/your_domen/public_html/gb/';
 $filename=$dir.'listgb.txt';
 open (FLFL, "$filename");
 foreach $stroka (<FLFL>) {
  ($id,$gbdir)=split(/::/,$stroka);
  last if ($id eq $gbid);
 }
 close FLFL;
 exit if ($id ne $gbid);
 $filename=$dir.$gbdir.'/countf.txt';
 open (FILE, "$filename");
 $countf = <FILE>;
 close(FILE);
 exit if ($countf<$numzap);
 $numzap=$countf if (! $numzap);
 print "Content-Type: text/html\n\n";
 print '<html><head></head><body><p><b> Удаляем запись</b></p><hr>';
 for ($iii=$countf; $iii>=1; $iii--) {
  if ($iii==$numzap) {
   print '<b>'.$iii.'</b> ';
  } else {
   # В следующей строке изменим имя скрипта просмотра на имя скрипта,
   #  создаваемого нами в данный момент (showgb.cgi на showgbm.cgi);
   print '<a href=http://www.your_domen.com/cgi-bin/showgbm.cgi?'. $gbid.'&'.$iii.'>'.$iii.'</a> ';
  } #if
 } #for
 # Теперь это будет не просто страница просмотра, а веб-форма, в
 # которой можно будет отметить записи, подлежащие удалению;
 print '<form action="http://your_domen.com/cgi-bin/delgb.cgi" method="post">';
 # Чтобы пронумеровать строки именно в том порядке, в котором
 # они расположены в файле, будем считывать их напрямую из файла;
 $filename=$dir.$gbdir.'/'.$numzap.'.txt';
 open (FILE, "$filename");
 # Переменная $i будет счетчиком строк в файле;
 $i=0;
 foreach $stroka (<FILE>) {
  ($nik,$email,$message)=split(/|/,$stroka);
  print '<hr>';
  # Перед каждой записью поместим checkbox с номером этой записи в файле в качестве значения;
  print '<input type="checkbox" name="numdel" value='.$i.'>';
  print ' '.$email.', '.$nik.'<br>'.$message.'<hr>';
  $i=$i+1;
 } #foreach
 close(FILE);
 print '<input type="hidden" name="gbid" value='.$gbid.'>';
 # Нам понадобится еще и номер файла, из которого будут удалены отмеченные записи;
 print '<input type="hidden" name="numzap" value='.$numzap.'>';
 print '<input type="submit" value="Удалить"></form>';
 print '</body></html>';
 exit;

Второй скрипт будет называться delgb.cgi. Его назначение - удалить из файла-архива отмеченные нами записи.

#!/usr/local/bin/perl
&GetFormInput;
$gbid=$field{"gbid"};
$numdel=$field{"numdel"};
$numzap=$field{"numzap"};
# Если записей к удалению несколько, то их номера будут в переменной
#$numdel записаны через запятую. Разделим их и поместим полученный список в массив @numdel
@numdel=split(/\,/,$numdel);
$dir='/home2/your_domen/public_html/gb/';
$filename=$dir.'listgb.txt';
open (FLFL, "$filename");
foreach $stroka (<FLFL>) {
 ($id,$gbdir)=split(/::/,$stroka);
 last if ($id eq $gbid);
}
close FLFL;
exit if ($id ne $gbid);
$filename=$dir.$gbdir.'/'.$numzap.'.txt';
open (FILE, "+<$filename");
flock (FILE,2);
$i=0;
# Считываем по порядку все строки из файла;
foreach $stroka (<FILE>) {
 # Если номер строки не содержится в списке строк, предназначенных 
 # к удалению (узнаем это с помощью подпрограммы DelStr, передавая 
 # ей в качестве параметра номер текущей строки), заносим эту строку в
 # массив @stroki;
 @stroki=(@stroki, $stroka) if (! DelStr($i));
}
seek (FILE,0,0);
truncate(FILE,0);
# Запишем строки из массива обратно в файл. Напомню, что в массив
# мы помещали только строки, не предназначенные для удаления;
while ($stroka=(@stroki)) {
 print FILE "$stroka\n";
}
close(FILE);
# Покажем снова страницу администрирования с изменениями;
print "Location: http://www.your_domen.com/cgi-bin/showgbm.cgi?". $gbid."&".$numzap."\n\n";
exit;
# Подпрограмма, которая будет определять, есть ли в списке строк,
# предназначенных к удалению, строка с номером, переданным этой подпрограмме
# в качестве параметра;
sub DelStr {
 my ($ret) = 0;
 while ($numdel=(@numdel)) {
  $ret=1 if ($numdel==$_[0]);
 }
 return $ret;
}
sub GetFormInput {
 # Точно такая же подпрограмма, как и во всех предыдущих скриптах.
}

         

Итак, с администрированием гостевых книг покончили :-).
(...продолжение следует...)

Источник: http://www.mycomp.com.ua/

 


Copyright © "Internet Zone"info@izcity.com
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/. При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас.