Создание сайта, дизайн, web дизайн
Главная Работы Услуги Цены Контакты

 Главная
 Работы
 Услуги
 Цены
 Контакты
 

Каждый, кто начинает программировать на Перле, сталкивается с аббревиатурой CPAN, что значит Comprehensive Perl Archive Network ("всеобъемлющий архив по Перлу") CPAN - прекрасный ресурс, где можно отыскать все что угодно, связанное с Перлом. В мире много зеркал CPAN, так что выбирайте то, которое вам ближе географически. Для этого сходите на ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN, где есть список всех зеркал.

Немного об организации архива. Каждое зеркало центрального сервера содержит файл CPAN/Roadmap или CPAN/Roadmap.html, а также CPAN/modules/Readme, где есть описания всех содержащихся модулей. Вы скажете - Зачем нам эти модули? Мы и сами можем написать... Ну если так - то пожалуйста, пишите сами. А те, кто желает сэкономить время и силы, зайдите на CPAN и найдите для себя уже готовый модуль.

Не так давно передо мной стала задача - сделать что-то наподобие news-reader'а прямо на веб-странице. То есть: при обращении к серверу пользователь получает список сообщений в группе новостей (конференции) в виде ссылок на сами сообщения. Щелкнув по ссылке, пользователь сможет поглядеть картинку, содержащуюся в сообщении. Доступ к конференции осуществляется по протоколу NNTP.

Мне нужен был CGI, NNTP и base64 для декодирования картинок внутри сообщений. Для обеспечения CGI-интерфейса был взят модуль CGI.pm (CPAN/authors/id/LDS/CGI.pm-2.13.tar.gz). Для того, чтобы общаться с news-сервером по NNTP протоколу я нашел NNTPClient все там же на CPAN - CPAN/authors/id/RVA/NNTPClient-0.22.pm.gz. Ну и последний компонент - base64 декодировщик я нашел в модуле LWP (MIME:Base64) (CPAN/authors/id/LDS/CGI-modules-2.74.tar.gz.)

Использование библиотек, написанных не мной самим, позволило отвлечься от низкоуровневых задач, и сконцентрироваться на самом высоком уровне функционирования скрипта. Да и время сэкономило немало.

Вот такой скрипт получился в результате:

Скрипт 1

=1= #!/usr/bin/perl

=2=

=3= use CGI; # must be version 2 or higher

=4= use News::NNTPClient;

=5= use MIME::Base64;

=6=

=7= $nntpserver = "news.teleport.com"; # location of news server

=8=

=9= ## because of the copyright nature of this material, you should

=10= ## put this script in a directory that has an appropriate htaccess file.

=11=

=12= @groups = (

=13= ["clari.living.comics.bizarro", "Bizarro"],

=14= ["clari.living.comics.cafe_angst","Cafe Angst"],

=15= ["clari.living.comics.doonesbury","Doonesbury"],

=16= ["clari.living.comics.forbetter","For Better or For Worse"],

=17= ["clari.living.comics.foxtrot","Foxtrot"],

=18= ["clari.living.comics.ozone_patrol","Ozone Patrol"],

=19= ["clari.editorial.cartoons.toles","Toles"],

=20= ["clari.editorial.cartoons.worldviews","Worldviews"],

=21= ["clari.news.photos","News photos (not a comic, but handy)"],

=22= );

=23=

=24= $Q = new CGI;

=25= $Qself = $Q->self_url;

=26=

=27= unless ($group = $Q->param('group')) { # nothing at all, give index

=28= $links = join "\n",

=29= map { "<p><a href=\"$Qself?group=$_->[0]\">$_->[1]</a>" } @groups;

=30=

=31= print <<"GROK"; q/"/;

=32= @{[$Q->header]}

=33= @{[$Q->start_html('Comics','merlyn@stonehenge.com')]}

=34= <h1>Read the Comics</h1>

=35= <p>Select the group you want to read:

=36= <HR>

=37= $links

=38= <HR>

=39= <p>Please respect the copyrights and license agreements of this service.

=40= @{[$Q->end_html]}

=41= GROK

=42= q/"/;

=43= exit 0;

=44= }

=45=

=46= unless ($article = $Q->param('article')) { # group but no art, give group

=47= $N = new News::NNTPClient($nntpserver,119,0);

=48= for ($N->xover($N->group($group))) {

=49= ($numb,$subj) = split /\t/;

=50= $links .= "<p><a href=\"$Qself&article=$numb\">$subj</a>\n";

=51= }

=52=

=53= print <<"GROK"; q/"/;

=54= @{[$Q->header]}

=55= @{[$Q->start_html('Comics','merlyn@stonehenge.com')]}

=56= <h1>Read the Comics</h1>

=57= <p>Select the article you wish to view:

=58= <HR>

=59= $links

=60= <HR>

=61= <p>Please respect the copyrights and license agreements of this service.

=62= @{[$Q->end_html]}

=63= GROK

=64= q/"/;

=65= exit 0;

=66= }

=67=

=68= ## $group and $article both valid:

=69= $N = new News::NNTPClient($nntpserver,119,0);

=70= $N->group($group);

=71= @art = $N->article($article);

=72= shift @art while @art and $art[0] !~ /^Content-Type: (image\/[-a-z]+)/;

=73= $type = $1;

=74= shift @art while @art and $art[0] !~ /^\s*$/;

=75= pop @art; # heh

=76= $gif = decode_base64(join "", @art);

=77= print "Content-type: $type\n\n";

=78= print $gif;

=79= exit 0;

 

Комментарии:

Строки 3-5: подключение модулей

Строка 7: Адрес news-сервера можно конечно же поменять.

Строки 12-22 определяют массив названий групп, в длинной форме - для сервера и в короткой - для человека. Длинное имя можно получить, например, так - $groups[2][0], а короткое - $groups[2][1]

В строке 24 создается CGI-объект $Q. Входные данные скрипт может получать из командной строки, через переменную окружения и из стандартного потока ввода.

Строка 25 позволяет получитьURL скрипта, который используется в дальнейшем.

В 27 строке проверяется входной параметр 'group'. И если его нет - то выводится полный список групп. Строки 28-44 создают страничку со списком доступных групп на основе массива @groups 28-29 строки создают переменную $links, содержащую ссылки на группы в виде:

<p><a href="SOMEWHERE?group=clari.living.comics.doonesbury">Doonesbury</a>

Где SOMEWHERE - это как раз URL скрипта.

Строки с 32 по 40 выводят результат - заголовок, начало HTML-документа, список ссылок и конец HTML-документа. Конструкция @{[thing]} - это вывод 'thing' в списковом контексте. Можно было вместо этого просто разбить оператор print на несколько операторов print.

Строка 46: проверка на наличие входного параметра article.

Строки с 47 по 65 выводят список сообщений в выбранной группе.

Строка 47: установление соединения с news-сервером (порт 119 - стандартный)

Строки с 48 по 51: вывод тем всех сообщений в данной конференции. Выражение в строке 48 возвращает массив строк, где символом табуляции разделены номер и тема сообщения. 49 строка разбивает строки, а 50тая - создает строку со списком уже в HTML-виде, где на каждое сообщение - своя ссылка:

<p><a href="SOMEWHERE?group=clari.living.comics.doonesbury&article=123">Doonesbury 950101</a>

Строки 52-60: вывод результатов

Строка 69 начинает часть скрипта, которая непосредственно выдает картинки, содержащиеся в отдельных сообщениях. Снова устанавливается соединение с news-сервером, и забирается уже конкретное сообщение.

Строка 71: сообщение укладывается в массив @art

Строка 72: так как важна только та часть сообщения, которая начинается с Content-type, то все остальные строки можно выкинуть. При этом сохраняется тип картинки (строка 73).

Строки 74-75: Пустая строка после Content-type пропускается

Строка 76: непосредственно декодирование из base64

Строки 77-78: вывод картинки браузеру




Владимир Пржиялковский mailto:prz@yandex.ru
Состояние воздуха:
Мониторинг загрязнения атмосферы в режиме реального времени
© 2004-2017 LABDESIGN.RU   e-mail: