Рассылка закрыта
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Декабрь 2000 → | ||||||
1
|
2
|
3
|
||||
---|---|---|---|---|---|---|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
26
|
27
|
28
|
29
|
30
|
Статистика
за неделю
Программирование скриптов на Perl'e (Выпуск №9)
Программирование скриптов на Perl'e (выпуск ).
Здравствуйте дорогие мои подписчики.
Сегодня в выпуске:
- Несколько слов перед началом
- Perl для начинающих - Операторы для работы со строками
- CGI-программирование - Гостевая книга
- "Лучшая ссылка"
- О рассылке
Несколько слов перед началом
Ну вот, наконец-то на подходе "линолеум". Опять. Во второй раз весь мир будет встречать новое тысячелетие. Как и в прошлом году.
Я надеюсь, что до наступления нового тысячелетия свершится еще одно знаменательное событие, но об этом в следующем, юбилейном, выпуске рассылки, который, как я надеюсь, выйдет еще в этом тысячелетии.
А теперь мы перейдем непосредственно к изучению Perl'а. И сегодняшние темы:
Perl для начинающих - Операторы для работы со строками
В ближайших выпусках рассылки (а может быть даже в следующем) я планирую параллельно с теорией перейти к практическому применению Perl'а. Но для этого нужно рассмотреть функции для работы с основным типом данных языка Perl - строкой. Ведь фактически любую информацию Perl хранит в виде строк.
chomp список
chomp переменная
Использует значение специальной переменной $/ для последнего символа переменной или строки или каждого
элемента списка. Последний символ будет удален только в том случае, если он равен значению переменой $/.
chop список
chop переменная
Делает то же самое, что и предыдущая функция, но в качестве результата эта функция возвращает сам удаленный символ.
chr число
Возвращает символ из ASCII-таблицы с кодом number. Например, chr(65) возвратит символ 'A'.
index строка, подстрока
index строка, подстрока, позиция
Возвращает позицию первого вхождения "подстроки" в "строке" считая от заданной "позиции". Если параметр
"позиция" не задан, то сравнение строк ведется от начала "строки".
join выражение, список
Возвращает строку, в которой все элементы "списка" соединены "выражением". Например,
join (">>", ("a","b","c")) возвратит строку "a>>b>>c".
lc строка
Возвратит строку, где все символы прописные. Например, lc ("ABCD") возвратит "abcd".
lcfirst строка
Возвратит строку, в которой только первый символ прописной. Например, lcfirst ("ABCD")
возвратит "aBCD".
length строка
Возвращает длину строки.
rindex строка, подстрока
rindex строка, подстрока, позиция
То же, что и index (смотрите выше), но возвращает позицию последнего вхождения.
split
split /шаблон/
split /шаблон/, строка
split /шаблон/, строка, предел
Разбивает строку на части, принимая за границу значение параметра "шаблон". Например,
($a, $b, $c) = split (/::/, "1::2::3") присвоит переменным $a, $b, $c значения "1", "2", "3"
соответственно. Если же результат используется в скалярном контексте, то функция возвращает
количество найденных таким образом элементов.
substr строка, смещение, длина
Возвращает часть строки, как определено параметрами "смещение" и "длина". Если "длина" не указана,
возвращается все, что находится на промежутке от "смещения" до конца строки. Отрицательные значения
"смещения" могут использоваться для сканирования с правого края строки.
uc строка
То же самое, что и lc (смотрите выше), но все символы заглавные.
ucfirst строка
То же самое, что lcfirst (смотрите выше), но символ заглавный.
В случае если Perl встречает число там, где ожидает встретить строку, он просто преобразовывает число в строку, освобождая вас от дополнительной работы. Следующие несколько примеров демонстрируют применение некоторых строковых функций.
Пример 1: изменение значения строки
Очень часто Вам, возможно, понадобится изменять части строк - как правило, где-то в середине строки. Когда перед Вами станет такая задача, то смело можете воспользоваться функцией substr(). Обычно эта функция используется для получения строки из существующей строки - на основании трех параметров - исходной строки, смещения, которое есть начало новой строки и длины новой строки.
$firstVar=substr("0123BBB789", 4, 3); print "firstVar=$firstVar\n"; Программа напечатает: firstVar = BBBПрименение данной функции становится гораздо более интересным, когда Вы используете ее слева от оператора присваивания:
$firstVar="0123BBB789"; substr($firstVar, 4, 3)="AAA"; print "firstVar=$firstVar\n"; Программа напечатает: firstVar=0123AAA789Пример 2: поиск строки
Другая интересная задача, которую Вы можете решить с помощью строковых функций - это поиск заданной подстроки в строке. Например, у Вас есть полное имя файла, включая путь: "/root/temp/data.dat", а Вам нужно получить из него только имя файла. Вы можете это сделать, найдя последний слеш (символ '/'), а за тем применив функцию substr().
$pathName="/root/temp/data.dat"; $position=rindex($pathName, "/")+1; $fileName=substr($pathName, $position); print "$fileName\n"; Программа напечатает: data.datМы не указали здесь третий параметр функции substr() - длину, - это потому что нам нужно взять подстроку до конца исходной строки.
На этом позвольте на сегодня закончить.
CGI-программирование - Гостевая книга
Скоро Новый Год, а что такое Новый Год? Новый Год - это веселье, праздник, гости. А что нужно гостям? Гостям нужна гостевая книга и именно в Новый Год :-)
И сегодня мы поговорим о создании гостевых книг.
Прежде всего, надо определиться с функциями гостевой книги. С тем, что она должна делать, какие функции должны в ней присутствовать.
В принципе функций не так уж и много:
и все, ну в основном.
Для начала напишем два HTML-документа: для добавления записи и для просмотра оставленных записей.
Файл guestadd.html
<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"> <TITLE>Гостевая книга : Добавление записи</TITLE> </HEAD> <BODY BGCOLOR="#C5BC9B" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> <TABLE WIDTH=780 HEIGHT=420 BORDER=1 ALIGN="CENTER" CELLPADDING=10 CELLSPACING=0 BGCOLOR="#F6E9C0"> <TR VALIGN="TOP"> <TD> Добро пожаловать в нашу гостевую книгу. На этой странице Вы можете добавить свой отзыв о нашем сайте в книгу, а нажав <A HREF="guestview.html">сюда</A>, Вы cможете просмотреть другие отзывы, оставленные ранее. <P><BR> <FORM ACTION="/cgi-bin/guest.cgi" NAME="RecordForm" METHOD="POST" TARGET="_blank"> <INPUT TYPE="HIDDEN" NAME="record" VALUE="add"> <table border=0 width="720" ALIGN=CENTER id=TEXT1> <tr> <td width="30%">Ваше имя:</td> <td> <input type="text" size="55" maxlength="80" name="name"> Пол: <INPUT TYPE="radio" NAME="gender" VALUE="male" CHECKED> Муж <INPUT TYPE="radio" NAME="gender" VALUE="female"> Жен </td> </tr> <tr> <td width="30%">Ваш E-mail:</td> <td><input type="text" size="80" maxlength="80" name="email"></td> </tr> <tr> <td width="30%">Ваш Web-адрес:</td> <td><input type="text" size="80" maxlength="80" name="web"></td> </tr> <tr> <td width="30%">Текст записи:</td> <td><textarea name="mess" rows="10" cols="69" wrap="VIRTUAL"></textarea></td> </tr> </table> <DIV ALIGN="center"><BR> <INPUT TYPE="SUBMIT" VALUE="Добавить"> <INPUT TYPE="RESET" VALUE="Очистить"> </DIV> </form> </TD> </TR> </TABLE> </BODY> </HTML>Выглядит он следующим образом:
Добро пожаловать в нашу гостевую книгу. На этой странице Вы можете добавить
свой отзыв о нашем сайте в книгу, а нажав сюда, Вы cможете просмотреть другие
отзывы, оставленные ранее.
|
Файл guestview.html
<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"> <TITLE>Гостевая книга : Просмотр записей</TITLE> </HEAD> <BODY BGCOLOR="#C5BC9B" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> <TABLE WIDTH=780 HEIGHT=150 BORDER=1 ALIGN="CENTER" CELLPADDING=10 CELLSPACING=0 BGCOLOR="#F6E9C0"> <TR VALIGN="TOP"> <TD> Добро пожаловать в нашу гостевую книгу. На этой странице Вы можете просмотреть отзывы, которые были оставленны ранее, а нажав <A HREF="guestadd.html">сюда</A>, Вы cможете добавить свой отзыв о нашем сайте в книгу. <P><BR> <FORM ACTION="/cgi-bin/guest.cgi" NAME="RecordForm" METHOD="POST" TARGET="_top"> <INPUT TYPE="HIDDEN" NAME="record" VALUE="view"> <table border=0 width="410" ALIGN=CENTER id=TEXT> <tr> <td>Количество записей на странице: <SELECT NAME="recinpage"> <OPTION VALUE="1"> 1 <OPTION VALUE="5"> 5 <OPTION VALUE="10"> 10 <OPTION VALUE="20"> 20 <OPTION VALUE="50"> 50 </SELECT> <INPUT TYPE="SUBMIT" VALUE="Смотреть"> </td> </tr> </table> </form> </TD> </TR> </TABLE> </BODY> </HTML>Выглядит он следующим образом:
Добро пожаловать в нашу гостевую книгу. На этой странице Вы можете просмотреть
отзывы, которые были оставленны ранее, а нажав сюда, Вы cможете добавить свой отзыв о нашем сайте в книгу.
|
Как понятно из вышеприведенных текстов для добавления записи требуется ввести имя, пол, E-mail адрес, Web адрес и свой комментарий. Для просмотра записей нужно указать какое количество записей на странице Вы хотите видеть.
А теперь приступим к созданию скрипта.
На мой взгляд, проще в одном скрипте объединить функции добавления записей и их просмотра, чем писать для этого две отдельные программы.
Основой скрипта будет проверка того, что нудно выполнить: добавить новую запись или просмотреть старые.
if ($FORM{'record'} eq "add") # добавление записи { } elsif ($FORM{'record'} eq "view") # просмотр записей { } exit 0;Для начала пройдемся по ветви добавления записи.
Первое, что нужно сделать - это сформировать новую запись. Запись строится сразу в HTML-виде, без разделения на поля. Для этого мы выделяем цветом имя оставившего запись. Затем проверяем заданы ли E-mail и Web адреса и если заданы, то оформляем их в виде ссылок. После этого добавим дату и время записи. Пол нам нужен для того, чтобы указать "написал" или "написала" новое сообщение. И, наконец, добавим само сообщение.
После того, как запись сформирована, ее нужно сохранить в файле. Для этого используется следующий фрагмент кода:
if (!open(DATAF, "<$GUESTFILE")) { $mess="Невозможно открыть файл с записями.<br> Вероятно произошла ошибка на сервере."; &Error($mess); } else { @records=<DATAF>; close DATAF; unshift @records, $newrecord; if (!open(DATAF, ">$GUESTFILE")) { $mess="Невозможно открыть файл с записями.<br> Вероятно произошла ошибка на сервере."; &Error($mess); } else { flock DATAF, 2; print DATAF @records; flock DATAF, 8; close DATAF; } }Здесь мы сперва читаем файл с записями, затем вставляем новую запись на первое место в файле (оператором unshift) и после этого сохраняем файл. В системе Windows нужно закомментировать строки flock DATAF, 2; и flock DATAF, 8;, так как эта функция пока не реализована в Perl for Windows. Для блокировки файла можно использовать пример, описанный в шестом выпуске рассылки.
Теперь, после того, как запись добавлена, остается только уведомить пользователя об этом:
&PrintHtml("Запись добавлена", "Ваша запись была успешно добавлена. Спасибо за ваш отзыв.");Теперь перейдем к ветви просмотра записей.
Если количество записей в базе меньше запрошенного на одной странице, то вернем в браузер пользователя сразу все записи:
if (($FORM{'recinpage'}>=@records) && ($FORM{'contfrom'}==undef)) { &Printtpl("head"); print @records; &Printtpl("foot"); exit 0; }Если количество записей в базе больше запрошенного на одной странице, то будем возвращать пользователю требуемое количество записей, при этом учитывая количество уже просмотренных записей:
if ($FORM{'contfrom'}!=undef) { @return=splice(@records, $FORM{'contfrom'}, $FORM{'recinpage'}); } else { @return=splice(@records, 0, $FORM{'recinpage'}); }И, наконец, нам нужно сформировать ссылки продолжения просмотра и возврата к предыдущим записям:
if ($FORM{'contfrom'}!=undef) { $startfrom=$FORM{'contfrom'}-$FORM{'recinpage'}; print "<A HREF=\"/cgi-bin/guest.cgi?record=view&recinpage=$FORM{'recinpage'}&contfrom=$startfrom\">Предыдущие $FORM{'recinpage'}</A>\n"; } if ($FORM{'contfrom'}+$FORM{'recinpage'}<$record) { $startfrom=$FORM{'contfrom'}+$FORM{'recinpage'}; print "<A HREF=\"/cgi-bin/guest.cgi?record=view&recinpage=$FORM{'recinpage'}&contfrom=$startfrom\">Следующие $FORM{'recinpage'}</A>\n"; }Кажется все. А теперь полный текст скрипта guest.cgi
#!/usr/bin/perl %FORM=(); $mess=''; $newrecord=''; $GUESTFILE='./data/guest/guestbook.dat'; ($result, $mess)=&GetFormInput; # произвели разбор запроса &Error($mess) if ($result==0); # если неудачно - сообщение if ($FORM{'record'} eq "add") { $FORM{'mess'}=~s/^(\S+)/ \ \ \ $1/g; $FORM{'mess'}=~s/\n/<BR> \ \ \ /g; $FORM{'mess'}=~s/\r//g; @datatime=localtime(time); $Time=$datatime[2].":".(length($datatime[1])==1 ? "0".$datatime[1] : $datatime[1]); $Data=(length($datatime[3])==1 ? "0".$datatime[3] : $datatime[3]).".". (length($datatime[4])==1 ? "0".$datatime[4] : $datatime[4]).".". ($datatime[5]+1900); $newrecord="<HR><P><FONT COLOR=\"#AD1D09\">$FORM{'name'}</FONT>"; if ($FORM{'email'} ne "") { $newrecord.=" (E-mail: <A HREF=\"mailto:$FORM{'email'}\">$FORM{'email'}</A>"; if ($FORM{'web'} ne "") { $newrecord.=", Web: <A HREF=\"$FORM{'web'}\">$FORM{'web'}</A>), "; } else { $newrecord.="), "; } } elsif ($FORM{'web'} ne "") { $newrecord.=" (Web: <A HREF=\"$FORM{'web'}\" TARGET=\"_blank\">$FORM{'web'}</A>), "; } else { $newrecord.=", "; } $newrecord.="побывав у нас в гостях, $Data в $Time"; if ($FORM{'gender'} eq "male") { $newrecord.=" написал следующее:<P>"; } else { $newrecord.=" написала следующее:<P>"; } $newrecord.="$FORM{'mess'}<P>\n"; if (!open(DATAF, "<$GUESTFILE")) { $mess="Невозможно открыть файл с записями.<br>Вероятно произошла ошибка на сервере."; &Error($mess); } else { @records=<DATAF>; close DATAF; unshift @records, $newrecord; if (!open(DATAF, ">$GUESTFILE")) { $mess="Невозможно открыть файл с записями.<br>Вероятно произошла ошибка на сервере."; &Error($mess); } else { flock DATAF, 2; print DATAF @records; flock DATAF, 8; close DATAF; } } # Сгенерируем ответ &PrintHtml("Запись добавлена", "Ваша запись была успешно добавлена. Спасибо за отзыв о нашей работе."); } elsif ($FORM{'record'} eq "view") { if (!open(DATAF, "<$GUESTFILE")) { $mess="Невозможно открыть файл с записями.<br>Вероятно произошла ошибка на сервере."; &Error($mess); } else { @records=<DATAF>; $record=@records; close DATAF; if (($FORM{'recinpage'}>=@records) && ($FORM{'contfrom'}==undef)) { &Printtpl("head"); print @records; &Printtpl("foot"); exit 0; } if ($FORM{'contfrom'}!=undef) { @return=splice(@records, $FORM{'contfrom'}, $FORM{'recinpage'}); } else { @return=splice(@records, 0, $FORM{'recinpage'}); } &Printtpl("head"); print @return; print "<CENTER>\n"; if ($FORM{'contfrom'}!=undef) { $startfrom=$FORM{'contfrom'}-$FORM{'recinpage'}; print "<A HREF=\"/cgi-bin/guest.cgi?record=view&recinpage=$FORM{'recinpage'}&contfrom=$startfrom\">Предыдущие $FORM{'recinpage'}</A>\n"; } if ($FORM{'contfrom'}+$FORM{'recinpage'}<$record) { $startfrom=$FORM{'contfrom'}+$FORM{'recinpage'}; print "<A HREF=\"/cgi-bin/guest.cgi?record=view&recinpage=$FORM{'recinpage'}&contfrom=$startfrom\">Следующие $FORM{'recinpage'}</A>\n"; } print "</CENTER>\n"; &Printtpl("foot"); } } exit 0; # Подпрограммы sub Printtpl { local($hf)=$_[0]; if ($hf=~/head/) { print <<END_HTML; Content-Type: text/html <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"> <TITLE>Гостевая книга : Просмотр записей</TITLE> </HEAD> <BODY BGCOLOR="#C5BC9B" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> <TABLE WIDTH=780 HEIGHT=100% BORDER=1 ALIGN="CENTER" CELLPADDING=10 CELLSPACING=0 BGCOLOR="#F6E9C0"> <TR VALIGN="TOP"> <TD> END_HTML } if ($hf=~/foot/) { print <<END_HTML; </TD> </TR> </TABLE> </BODY> </HTML> END_HTML } } # Подпрограмма вывода сообщения об ошибке sub Error { local($message)=$_[0]; &PrintHtml("Произошла ошибка", $message); exit 0; } # Подпрограмма вывода HTML-документа sub PrintHtml { local($title, $message)=@_; print <<END_HTML; Content-Type: text/html <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"> <TITLE>$title</TITLE> </HEAD> <BODY> $message </BODY> </HTML> END_HTML } # Подпрограмма разбора входного запроса sub GetFormInput { local($name, $value, $buffer, $err, $pair, @pairs); $err=""; if ($ENV{'REQUEST_METHOD'} eq 'GET') { @pairs=split(/&/, $ENV{'QUERY_STRING'}); } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs=split(/&/, $buffer); } else { $err="Возможно произошла внутренняя ошибка сервера.<br>"; $err.="Попытайтесь повторить отправку данных."; return(0, $err); } foreach $pair (@pairs) { ($name, $value)=split(/=/, $pair); $value=~tr/+/ /; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/gem; $FORM{$name}=$value; } return(1, $err); }
"Лучшая ссылка"
Сегодня в этом разделе я хочу дать ссылку, которая имеет к Perl'у весьма отдаленное, да и к тому же косвенное отношение.
Недавно, проходя мимо книжного киоска, я заметил в нем книгу, которая меня весьма сильно заинтересовала. Купив ее, я понял, что не ошибся. Она называется "Perl: Специальный справочник" и выпущена издательством "Питер" (http://www.piter-press.ru).
Книга совсем новая, она была издана в сентябре 2000 года и представляет собой перевод книги Стивена Холзнера, выпущенной издательством "Coriolis" в 1999 году.
Если Вы сталкивались уже с "Питерскими" книгами серии "Справочник", то мне Вам и объяснять ничего не придется, а если нет, то могу сказать что более ценного справочника по языку, его синтаксису, применению и возникающим проблемам мне на сегодняшний день не попадалось, хотя в моей библиотеке есть теперь 5 книг по Perl'у, не считая электронной литературы.
Эта книга, при ее заказе непосредственно на сайте издательства "Питер" (http://www.piter-press.ru) стоит 95 рублей. Ее объем - около 500 страниц, причем 500 страниц качественной информации.
На этом же сайте Вы можете заказать и многие другие книги по разным направлениям, причем по ценам издательства. Здесь же можно и посмотреть прайс-лист на печатную продукцию издательства. Кроме того, Вы можете написать их письмо с просьбой выслать этот каталог по электронной почте. Писать можно по следующим адресам: book@piter-press.ru и sales@piter-press.ru.
Надеюсь, что эта книга поможет Вам в изучении этого прекрасного языка.
О рассылке
В связи с тем, что ко мне часто приходят письма вновь подписавшихся с просьбой выслать предыдущие номера рассылки или указать где их можно взять, я даю адреса на subscribe.ru связанные с моей рассылкой.
Домашняя страница этой рассылки в Каталоге subscribe.ru: http://subscribe.ru/catalog/comp.soft.prog.perlprog/, здесь же Вы можете и подписаться на данную рассылку.
Архив этой рассылки находится на subscribe.ru по адресу: http://subscribe.ru/archive/comp.soft.prog.perlprog/
Данная рассылка распространяется только через subscribe.ru.
Если Вам понравилась эта рассылка, и Вы считаете, что она может быть полезна и другим, то отправьте ее
своим друзьям.
Ну, на этом позвольте на сегодня закончить. До новых встреч.
При подготовке данной рассылки были использованы следующие материалы:
1. "Изучаем Perl. Глава 5" Андрей Сергиенко
http://subscribe.ru/
E-mail: ask@subscribe.ru |
|
В избранное | ||