This page has been robot translated, sorry for typos if any. Original content here.

Cet article est écrit pour les personnes qui, en raison de circonstances impérieuses, ont exhorté à étudier de toute urgence Pearl. Pour moi, c'est devenu une telle circonstance que mon ordinateur est devenu un serveur WEB, seulement moi, respectivement, WEB-master. L'apprentissage est fait sur les erreurs des autres est aussi une expérience, donc je vous conseille de votre intérêt pour votre expérience d'étude de Perla.

A la fois, il est nécessaire d'expliquer, pour qui tout est écrit. Si votre serveur fonctionne sur une plate-forme UNIX, nous sommes obligés de prononcer votre article. J'ai également Windows NT Workstation 4.0 (RUS) plus Service Pack 3. À quelle heure il était temps de faire un serveur WEB hors de l'ordinateur, nous nous sommes précipités sur les services intégrés du site WEB, mais nous nous sommes vite rendus compte que je ne l'aimais pas? ). Et puis, un individu sympathique a conseillé de mettre Xitami WEB Server de iMatix Corporation ( www.imatix.com ), qui coûte aussi ce jour.

Ce qui touche Pearl lui-même, alors voici un peu plus compliqué. Après avoir fouillé divers serveurs Perl (www.perl.org, www.perl.com), nous avons appris qu'il y a tellement de versions de Perl qu'il est assez difficile de choisir quelque chose de concret. En même temps, il n'y a aucune recommandation intelligible concernant l'élection d'une version particulière. Après avoir essayé toutes les versions pour Windows, nous avons arrêté notre élection à Active Perl.

Man, gâté par tous les camions Widow aussi Delphi, les programmes de gribouillage pour Pearl sont assez inhabituels, donc je vous recommande vivement d'installer Perl Builder immédiatement. Vous pouvez le prendre à www.solutionsoft.com. Il y avait une variété Demo de trente jours.

Eh bien, je pense qu'il est temps d'aller directement à la leçon. En général, le script pour Pearl, ainsi que tout autre programme, fonctionne comme ceci:

  1. reçoit des données
  2. traite les données
  3. produit des résultats

Envoyer des données au script peut être des méthodes dupliquées - GET POST également. La différence entre eux est que lors de l'utilisation de GET, les données sont inactive non-stop dans la barre d'adresse du navigateur, napimer:

httр://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta

Dans ce cas, le script B_price.pl prend des données dans la variable d'environnement QUERY-STRING.

$data=$ENV{'QUERY_STRING'};

Lors de l'utilisation de la méthode POST, les données sont transmises à l'entrée de script standard. La longueur du bloc de données est prise dans la variable CONTENT_LENGTH:

read(STDIN,$data,$ENV{'CONTENT_LENGTH'});

Maintenant, ces données doivent être traduites sous forme digestible, car elles sont codées.

L'accord standard est le remplacement des espaces avec des signes ainsi que l'encodage des caractères inacceptables restants en utilisant des codes ASCII en notation hexadécimale, avec le signe (%) étant précédé. Exemple:

http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3

Cela signifie:

http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=Видео&Description=абвг

Il est préférable de décoder la chaîne de requête dans la chaîne principale. Sur la tâche "comment?" il y a beaucoup de réponses qui ne peuvent pas être réécrites. Je ne citerai qu'un petit échantillon:

Remplacer les signes (+) par des espaces

$query = s/\+/ /g;

Ensuite, nous remplaçons toutes les combinaisons du signe (%), suivies plus tard par des chiffres hexadécimaux, avec le caractère ASCII correspondant

$query = s/%([0-9A-H]{2})/pack('C', hex($1))/eg;

J'utilise ce que Perl Builder conseille:

#! E:\perl5\bin\perl &GetFormInput; # вызов подпрограммы получения данных $Category = $field{'Category'}; # приобретаем данные из поля Category $Description = $field{'Description'}; # приобретаем данные из поля Description $Page = $field{'Page'}; # приобретаем данные из поля Page

A la fin du script, placez le sous-programme "transparent" de lecture des données.

sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$buf,$ENV{'CONTENT_LENGTH'}); } else { $buf=$ENV{'QUERY_STRING'}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=tr/+/ /; $val= s/%(..)/pack("c",hex($1))/ge; $name=tr/+/ /; $name= s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; } } } return 1; }

La deuxième étape du travail du script - terminer les données - est entièrement à vous. Vérifiez l'exactitude des données reçues, écrivez-les dans un fichier, faites ce que vous voulez.

Et, à la fin, vous devez donner quelques résultats au navigateur du client, et ainsi le navigateur les affiche correctement. Autrement dit, vous devez afficher les résultats en HTML. Ceci est fait simplement: (également possible de différentes manières)

print 'Content-type: text/html', "/n/n"; #обязательная строка print 'Content-type: text/html', "/n/n"; #обязательная строка print '

Dans le champ Catégorie, vous avez tapé: ', $ Category,'

', "\ n"

Tout cela touche les scripts qui reçoivent des données du formulaire sur la page HTML. En même temps la page avec le formulaire est séparée, le script est séparé. Il est possible de le rendre plus beau aussi plus commodément: d'unir une page et un script en un seul ensemble. Pour cela, le script est écrit selon le schéma suivant:

  1. Au démarrage principal, le script dessine une page HTML avec un formulaire et un lien dans la balise ACTION. Le premier cycle est déterminé par le manque de données d'entrée.
  2. Si les données d'entrée sont, alors nous les obtenons, nous les traitons, et nous donnons aussi les résultats.

Exemple:

#! E:\perl5\bin\perl if (($ENV{'QUERY_STRING'} eq '') or ($ENV{CONTENT_LENGTH}=0) ) { # генерируем страницу с формой } else {# приобретаем данные, обрабатываем также выдаем результат}

Livre d'or

L'algorithme général du livre d'or est le suivant:

1. Si un visiteur veut enregistrer dans un livre, alors
1.1 Obtenir les données
1.2 Ecrivez-les dans un fichier ou dans une base de données
1.3 Nous disons merci au HTML recommande également de lire d'autres entrées
2. Si un visiteur veut honorer des entrées dans un livre, alors
2.1 Lecture des enregistrements d'un fichier ou d'une base de données
2.2 Les afficher bien en HTML

Pour la commodité de la perception, nous avons conçu des points 1 et 2 scripts séparés add_guestbook.pl aussi read_guestbook.pl respectivement. Les messages du livre d'or sont stockés dans un fichier texte ligne par ligne, c'est-à-dire pour chaque entrée est une chaîne. Ceci est fait pour la commodité de lire ce fichier. Un exemple d'un enregistrement:

Sam 5 déc 13:31:20 1998 & Natasha & étudiant & Good & Pour la source bien. Succès dans ce domaine à vous, Alexander! & Not@poka1919.226.60.34

Voici une description des champs du livre d'or en question.
Nom - nom, prénom, patronyme, surnom - à la discrétion du visiteur
Travail - profession, famille de professions
RadioButton - trois boutons: comme (Bon), n'a pas aimé (Mauvais), pofigu (Différent)
Texte - commentaires et notes dans la zone de texte
Email - adresse de retour

add_guestbook.pl - entrée dans le livre

#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl if (($ENV{'QUERY_STRING'} eq '') or ($ENV{CONTENT_LENGTH}=0) ) { # если нет входных данных, то генерируем страницу с формой print < <head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>Книга жалоб также предложений</title></head><body background="../images/background_new.jpg"><div align="left"><table border="0" width="630" height="49"> <tr> <td width="200" height="45"></td> <td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td> </tr></table></div><div align="left"><table border="0" width="630" height="53" cellspacing="0" cellpadding="0"> <tr> <td width="200" height="260" valign="top"> <p align="center">HTML DoInclude("_menu.htm"); # Это SSI-включение навигационной панели. print <<HTML; </p> <p align="left"> </td> <td width="10" height="53" valign="top"></td> <td width="410" height="53" valign="top"><table border="1" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%"><form name="GuestBook" method="POST" action="add_guestbook.pl"> <div align="left"><p><small>Я, <input type="text" name="Name" size="20"></small>, <small>по профессии бесхитростный </small><input type="text" name="Work" size="20">, <small>посетив этот сервер также ознакомившись с представленными на нем материалами, хочу выразить свои чувства , эмоции следующими приличными словами:</small></p> </div><div align="left"><p><small> </small><input type="radio" value="Good" checked name="RadioButton"><small>мне понравилось Souris heureux </small></p> </div><div align="left"><p><small> </small><input type="radio" name="RadioButton" value="Bad"><small>мне никак не понравилось Souris triste </small></p> </div><div align="left"><p> <input type="radio" name="RadioButton" value="Different"><small>мне пофигу :-| </small></p> </div><div align="left"><p><small>В дополнение к сказанному хочу так же сказать: </small></p> </div><div align="left"><p><textarea rows="4" name="Text" cols="30"></textarea></p> </div><div align="left"><p><small>Прошу принять к рассмотрению мое заявление также незамедлительно принять мерки. Решение по моему заявлению направить письменно на мой электрический адрес </small><input type="text" name="Email" size="20"><small>.</small></p> </div><div align="center"><center><p><input src="../images/send.JPG" name="Send" alt="Послать" border="0" type="image" WIDTH="53" HEIGHT="21"> <a href="read_guestbook.pl"><img src="../images/read.jpg" alt="Почитать" border="0" WIDTH="63" HEIGHT="21"></a></p> </center></div> </form> </td> </tr> </table> </td> <td width="10" height="53" valign="top"></td> </tr></table></div></body></html>HTML die; } # Нынче приобретаем входные данные. &GetFormInput; $Name = $field{'Name'} ; $Work = $field{'Work'} ; $RadioButton = $field{'RadioButton'} ; $Text = $field{'Text'} ; $Email = $field{'Email'} ; $Send = $field{'Send'} ; # это поле никак не используется # Проверяем, заполнены ли обязательные поля. # если нет - генерируем HTML страницу с прошением заполнить нужные поля. if ($Name eq '' || $Email eq '' || $Text eq '') { print <<HTML; Content-type: text/html <html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>Книга жалоб также предложений - ошибка</title></head><body background="../images/background_new.jpg"><div align="left"><table border="0" width="630" height="49"> <tr> <td width="200" height="45"></td> <td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td> </tr></table></div><div align="left"><table border="0" width="630" height="53" cellspacing="0" cellpadding="0"> <tr> <td width="200" height="260" valign="top"><p align="center">HTML DoInclude("D:/InetPub/wwwroot/_menu.htm"); print <<HTML; </p> <p align="left"> </td> <td width="10" height="53" valign="top"></td> <td width="410" height="53" valign="top"><p align="left"><small>Вы никак не указали свое имя, E-mail, или никак не заполнили самолично текст Вашего отзыва. Вернитесь, пожалуйста, на страницу формы также заполните требуемые поля.</small></p> <p align="center"><a href="add_guestbook.pl">Назад</a> </td> </tr></table></div><table> <tr> <td width="10" height="53" valign="top"></td> </tr></table></body></html>HTML } else # все данные правильно введены { # если все поля заполнены правильно, то затеваем их обрабатывать. $Text=tr/\r\n/ /; #заменяем перевод строки на пробел # если в текстовом поле формы (text box) посетитель нажимал Enter, # то нужно убрать символы перевода строки, чтобы можно было записать # все поля формы в одну строку файла. if ($Work eq '') {$Work=' '}; #если пусто - то пробел # если поле никак не заполнено, то оно равно пробелу. $Name=s/&/ /g; $Work=s/&/ /g; $Text=s/&/ /g; $Email=s/&/ /g; # если посетитель использовал символ &, то заменяем его на пробел, # поскольку этот символ мы будем использовать для деления наших полей в файле. open(OutFile, ">>guestbook.txt") || die; # Вскрываем файл для прибавления. $Time=localtime; #получаем время # Получаем пора заполнения гостевой книги. $line=join('&', $Time, $Name, $Work, $RadioButton, $Text, $Email, $ENV{REMOTE_HOST}); # И, в конце концов, слепляем все поля формы в одну строку. На каждый приключение добавляем в конце # IP адрес посетителя, взятый из переменных окружения. print OutFile "$line\n"; close OutFile; # Записываем полученную строку в файл также закрываем его. # Осталось только сказать посетителю спасибо. # выводим сообщение о успехе print "Content-type: text/html\n\n"; print "<html>\n" ; print "\n" ; print "<head>\n" ; print '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'."\n" ; print '<meta name="GENERATOR" content="Microsoft FrontPage 3.0">'."\n" ; print "<title>Книга жалоб также предложений</title>\n" ; print "</head>\n" ; print "\n" ; print '<body background="../images/background_new.jpg">'."\n" ; print '<div align="left">'."\n" ; print "\n" ; print '<table border="0" width="630" height="49">'."\n" ; print " <tr>\n" ; print ' <td width="200" height="45"></td>'."\n" ; print ' <td width="430" height="45"><p align="center">'; print '<img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print '</div><div align="left">'."\n" ; print "\n" ; print '<table border="0" width="630" height="53" cellspacing="0" cellpadding="0">'."\n" ; print " <tr>\n" ; print ' <td width="200" height="260" valign="top"><p align="center">'."\n" ; DoInclude("D:/InetPub/wwwroot/_menu.htm"); print ' <p align="left"> </td>'."\n" ; print ' <td width="10" height="53" valign="top"></td>'."\n" ; print ' <td width="410" height="53" valign="top"><p align="center"><small>Ваши данные'."\n" ; print " приняты. Спасибо.</small></p>\n" ; print ' <p align="center"><a href="read_guestbook.pl">'; print '<img src="../images/read.jpg" alt="Почитать" border="0" WIDTH="63" HEIGHT="21"></a> </td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print "</div>\n" ; print "\n" ; print "<table>\n" ; print " <tr>\n" ; print ' <td width="10" height="53" valign="top"></td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print "</body>\n" ; print "</html>\n" ; } # Не забываем подпрограмму разбора данных из формы. sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$buf,$ENV{'CONTENT_LENGTH'}); } else { $buf=$ENV{'QUERY_STRING'}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=tr/+/ /; $val= s/%(..)/pack("c",hex($1))/ge; $name=tr/+/ /; $name= s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; #if you want multi-selects to goto into an array change to: #$field{$name} .= "\0$val"; } } } return 1; } #! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl if (($ENV{'QUERY_STRING'} eq '') or ($ENV{CONTENT_LENGTH}=0) ) { # если нет входных данных, то генерируем страницу с формой print < <head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>Книга жалоб также предложений</title></head><body background="../images/background_new.jpg"><div align="left"><table border="0" width="630" height="49"> <tr> <td width="200" height="45"></td> <td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td> </tr></table></div><div align="left"><table border="0" width="630" height="53" cellspacing="0" cellpadding="0"> <tr> <td width="200" height="260" valign="top"> <p align="center">HTML DoInclude("_menu.htm"); # Это SSI-включение навигационной панели. print <<HTML; </p> <p align="left"> </td> <td width="10" height="53" valign="top"></td> <td width="410" height="53" valign="top"><table border="1" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%"><form name="GuestBook" method="POST" action="add_guestbook.pl"> <div align="left"><p><small>Я, <input type="text" name="Name" size="20"></small>, <small>по профессии бесхитростный </small><input type="text" name="Work" size="20">, <small>посетив этот сервер также ознакомившись с представленными на нем материалами, хочу выразить свои чувства , эмоции следующими приличными словами:</small></p> </div><div align="left"><p><small> </small><input type="radio" value="Good" checked name="RadioButton"><small>мне понравилось Souris heureux </small></p> </div><div align="left"><p><small> </small><input type="radio" name="RadioButton" value="Bad"><small>мне никак не понравилось Souris triste </small></p> </div><div align="left"><p> <input type="radio" name="RadioButton" value="Different"><small>мне пофигу :-| </small></p> </div><div align="left"><p><small>В дополнение к сказанному хочу так же сказать: </small></p> </div><div align="left"><p><textarea rows="4" name="Text" cols="30"></textarea></p> </div><div align="left"><p><small>Прошу принять к рассмотрению мое заявление также незамедлительно принять мерки. Решение по моему заявлению направить письменно на мой электрический адрес </small><input type="text" name="Email" size="20"><small>.</small></p> </div><div align="center"><center><p><input src="../images/send.JPG" name="Send" alt="Послать" border="0" type="image" WIDTH="53" HEIGHT="21"> <a href="read_guestbook.pl"><img src="../images/read.jpg" alt="Почитать" border="0" WIDTH="63" HEIGHT="21"></a></p> </center></div> </form> </td> </tr> </table> </td> <td width="10" height="53" valign="top"></td> </tr></table></div></body></html>HTML die; } # Нынче приобретаем входные данные. &GetFormInput; $Name = $field{'Name'} ; $Work = $field{'Work'} ; $RadioButton = $field{'RadioButton'} ; $Text = $field{'Text'} ; $Email = $field{'Email'} ; $Send = $field{'Send'} ; # это поле никак не используется # Проверяем, заполнены ли обязательные поля. # если нет - генерируем HTML страницу с прошением заполнить нужные поля. if ($Name eq '' || $Email eq '' || $Text eq '') { print <<HTML; Content-type: text/html <html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>Книга жалоб также предложений - ошибка</title></head><body background="../images/background_new.jpg"><div align="left"><table border="0" width="630" height="49"> <tr> <td width="200" height="45"></td> <td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td> </tr></table></div><div align="left"><table border="0" width="630" height="53" cellspacing="0" cellpadding="0"> <tr> <td width="200" height="260" valign="top"><p align="center">HTML DoInclude("D:/InetPub/wwwroot/_menu.htm"); print <<HTML; </p> <p align="left"> </td> <td width="10" height="53" valign="top"></td> <td width="410" height="53" valign="top"><p align="left"><small>Вы никак не указали свое имя, E-mail, или никак не заполнили самолично текст Вашего отзыва. Вернитесь, пожалуйста, на страницу формы также заполните требуемые поля.</small></p> <p align="center"><a href="add_guestbook.pl">Назад</a> </td> </tr></table></div><table> <tr> <td width="10" height="53" valign="top"></td> </tr></table></body></html>HTML } else # все данные правильно введены { # если все поля заполнены правильно, то затеваем их обрабатывать. $Text=tr/\r\n/ /; #заменяем перевод строки на пробел # если в текстовом поле формы (text box) посетитель нажимал Enter, # то нужно убрать символы перевода строки, чтобы можно было записать # все поля формы в одну строку файла. if ($Work eq '') {$Work=' '}; #если пусто - то пробел # если поле никак не заполнено, то оно равно пробелу. $Name=s/&/ /g; $Work=s/&/ /g; $Text=s/&/ /g; $Email=s/&/ /g; # если посетитель использовал символ &, то заменяем его на пробел, # поскольку этот символ мы будем использовать для деления наших полей в файле. open(OutFile, ">>guestbook.txt") || die; # Вскрываем файл для прибавления. $Time=localtime; #получаем время # Получаем пора заполнения гостевой книги. $line=join('&', $Time, $Name, $Work, $RadioButton, $Text, $Email, $ENV{REMOTE_HOST}); # И, в конце концов, слепляем все поля формы в одну строку. На каждый приключение добавляем в конце # IP адрес посетителя, взятый из переменных окружения. print OutFile "$line\n"; close OutFile; # Записываем полученную строку в файл также закрываем его. # Осталось только сказать посетителю спасибо. # выводим сообщение о успехе print "Content-type: text/html\n\n"; print "<html>\n" ; print "\n" ; print "<head>\n" ; print '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'."\n" ; print '<meta name="GENERATOR" content="Microsoft FrontPage 3.0">'."\n" ; print "<title>Книга жалоб также предложений</title>\n" ; print "</head>\n" ; print "\n" ; print '<body background="../images/background_new.jpg">'."\n" ; print '<div align="left">'."\n" ; print "\n" ; print '<table border="0" width="630" height="49">'."\n" ; print " <tr>\n" ; print ' <td width="200" height="45"></td>'."\n" ; print ' <td width="430" height="45"><p align="center">'; print '<img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print '</div><div align="left">'."\n" ; print "\n" ; print '<table border="0" width="630" height="53" cellspacing="0" cellpadding="0">'."\n" ; print " <tr>\n" ; print ' <td width="200" height="260" valign="top"><p align="center">'."\n" ; DoInclude("D:/InetPub/wwwroot/_menu.htm"); print ' <p align="left"> </td>'."\n" ; print ' <td width="10" height="53" valign="top"></td>'."\n" ; print ' <td width="410" height="53" valign="top"><p align="center"><small>Ваши данные'."\n" ; print " приняты. Спасибо.</small></p>\n" ; print ' <p align="center"><a href="read_guestbook.pl">'; print '<img src="../images/read.jpg" alt="Почитать" border="0" WIDTH="63" HEIGHT="21"></a> </td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print "</div>\n" ; print "\n" ; print "<table>\n" ; print " <tr>\n" ; print ' <td width="10" height="53" valign="top"></td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print "</body>\n" ; print "</html>\n" ; } # Не забываем подпрограмму разбора данных из формы. sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$buf,$ENV{'CONTENT_LENGTH'}); } else { $buf=$ENV{'QUERY_STRING'}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=tr/+/ /; $val= s/%(..)/pack("c",hex($1))/ge; $name=tr/+/ /; $name= s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; #if you want multi-selects to goto into an array change to: #$field{$name} .= "\0$val"; } } } return 1; }

C'est tout. Un exemple du script décrit peut être trouvé à http://treagraf.tasur.edu.ru/cgi-bin/add_guestbook.pl

read_guestbook.pl - lire un livre

#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl open(InFile, "guestbook.txt") || die; # Вскрываем файл с записями гостевой книги. @lines=<InFile>; # Читаем строки в массив. # Выдаем шапку HTML страницы. print <<HTML; Content-type: text/html <html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>Книга жалоб также предложений - нам пишут</title></head><body background="../images/background_new.jpg"><div align="left"><table border="0" width="630" height="49"> <tr> <td width="200" height="45"></td> <td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td> </tr></table></div><div align="left"><table border="0" width="630" height="53" cellspacing="0" cellpadding="0"> <tr> <td width="200" height="260" valign="top"><p align="center"><small>HTML DoInclude("D:/InetPub/wwwroot/_menu.htm"); print <<HTML; </p> <p align="left"> </td> <td width="10" height="53" valign="top"></td> <td width="410" height="53" valign="top"><p align="center">Нам пишут:</p> <table border="0" width="100%" cellspacing="0" cellpadding="0">HTML # Нынче выводим записи в невидимой (в смысле, рамка никак не видима) таблице. # Чтобы свежие записи отображать первыми, обрабатываем массив строк с конца. for ($i=$#lines; $i>=$[; $i--) #обрабатываем строки файла с конца { # Делим строку на элементы @item=split('&', $lines[$i]); #разделяем на элементы # Нынче заменяем HTML тэги в записи (на приключение какого-нибудь хитрого юзера) foreach (@item) { $_=s/</</g; $_=s/>/>/g; } # Приступаем непосредственно к заключению записей в HTML print "<tr>\n"; print '<td width="100%"><dl>'."\n"; # В зависимости от поля, в каком месте посетителю предлагался избрание понравилось - никак не понравилось, # рисуем картинку с радостной либо грустной мордочкой соответственно. В качестве ALT тэга # картинки пропишем IP адрес посетителя. print '<dt><img src="../images/'.$item[3].'.gif" width="31" height="31" alt="'; priny $item[6].'" align="absbottom"'."\n"; # Выводим остальные поля. print 'align="absmiddle"><small>'.' '.$item[4]."</small></dt>\n"; print '<dt><small>'.$item[1].', '.$item[2]."</small></dt>\n"; print '<dt><a href="mailto:'.$item[5].'"><small>'.$item[5].'</small></a></dt>'."\n"; print '<dt><small>'.$item[0]."</small></dt>\n"; print "</dl>\n"; print "</td>\n"; print "</tr>\n"; } # Осталось вывести окончание HTML print <<HTML; </table> </td> <td width="10" height="53" valign="top"></td> </tr></table></div></body></html>HTML close InFile; # Закрываем файл с записями гостевой книги.