| ||
Hello, Perl! Perl FAQ по-русски. Часть 4Дмитрий Репин aka cmapuk[0nline] В этой части статьи мы рассмотрим не менее популярные, чем CGI-программирование, аспекты использования Perl - клиент-серверные приложения и программы для работы с базами данных. Технология витья "гнезд" и LWP-кулинария"Крылья... Ноги... Главное - хост! Плетем гнезда. Стандартные инструменты Перл для работы с Сетью достаточно удобны и, в принципе, не нуждаются в надстройках. Исключение может составить разве что только модуль LWP. В этом разделе мы плавно пойдем от use Socket до use LWP; и таким образом попытаемся охватить все возможности сетевого Perl. Итак, стандартный модуль Socket. Socket - это модуль функционального типа. Описание всех его функций имеется в perldoc. Мы же рассмотрим сами принципы организации сетевых подключений. Не забывайте, что команда perldoc -f function - расскажет много интересного. use Socket; # Подключаем модуль REQ socket(SOCK,PF_INET,SOCK_S-TREAM,$protocol); $iaddr=gethostbyname('perl.ru'); $port=80; if(connect(SOCK,$packed_addr)){ Для метода POST вся работа с сокетом аналогична. Изменяется только запрос. $request=<<REQ; Конечно, данный способ менее всего удобен, но он позволяет контролировать весь процесс на всех стадиях его действия. Рассмотрим теперь этот же пример, но с использованием модуля IO::Socket; # Запрос тот же в $request if($sock){ Не сложнее, чем работа с файлами, правда? Стоит еще раз отметить: для UDP используется тип сокета SOCK_DGRAM и не требуется connect(), а для TCP - наоборот. В разделе "Чистая практика" мы еще вернемся к Socket и IO::Socket, а сейчас рассмотрим модуль LWP. LWP=lib-www-perlЭтот модуль весьма популярен среди программистов. Он представляет собой удобный интерфейс к модулям Socket и IO::Socket. Cобственно, лучшего рассказа про LWP, чем perldoc lwpcook, найти сложно. Поэтому я просто возьму примеры оттуда и сделаю комментарии. Метод GET при использовании LWP-Simple use LWP::Simple; Запуск с консоли >perl -MLWP::Simple -e 'getprint "http://www.sn.no/libwww-perl/";' Распечатка в STDIN >perl -MLWP::Simple -e 'getstore "ftp://ftp.sunet.se/ pub/lang/perl/CPAN/src/ latest.tar.gz";,"perl.tar.gz"' Скачать и сохранить файл как "perl.tar.gz" ######## В скрипте # Модуль HTTP::Request сделан для удобства создания запросов # Теперь отправляем # Проверим, все ли прошло ОК Метод HEAD для LWP-SimpleПри методе HEAD данные не отправляются и не принимаются. Между клиентом и сервером идет обмен только заголовками. Это полезно, например, для проверки существования файлов на сервере и т.п. use LWP::Simple; Метод POST (LWP-Simple нет)use LWP::UserAgent; Еще вариант use HTTP::Request::Common qw(POST); Используем PROXY-сервер use LWP::UserAgent; Если прокся с паролем use LWP::UserAgent; Доступ к ресурсам, защищенным htaccess use LWP::UserAgent; А Куки? use LWP::UserAgent; Секьюрный протокол HTTPS (SSL) use LWP::UserAgent; Создание зеркальных копий страницuse LWP::Simple; Доставка больших документов 1-й вариант. Записываем данные в процессе скачивания в файл use LWP::UserAgent; 2-й вариант. Вставка контролирующей подпрограммы в качестве второго аргумента $ua->request(). В этом варианте можно записывать скачиваемый файл по кусочкам, чтобы в случае обрыва связи потом его докачать. use LWP::UserAgent; Вот такой простой модуль. К нему мы еще вернемся, а сейчас перейдем к вопросам использования баз данных. От TXT до SQLИнформация имеет силу, только когда ее можно сохранить. Простые задачи. Perl, как и любой полноценный язык, предоставляет возможность сохранять/читать данные в/из различных источников, от файлов до SQL-образных баз данных. При таком многообразии главное - сделать правильный выбор. Для начала стоит определиться, с какими объемами данных будет работать программа, в какой форме эти данные и как часто будет использоваться программа. Для простейших задач подойдет и простой текстовый файл. Например, конфигурация программы. # config.dat Часто более удобным способом хранения информации являются простые базы данных - DBM-файлы. В этих файлах хранятся пары ключ/значение, а работа с данными производится через хэш, ассоциированный с DBM-файлом. DBM-базы бывают различных типов, зависящих обычно от операционной системы. Таблицу совместимости можно найти тут же - perldoc AnyDBM_File . Каждому типу соответствует свой Perl-модуль(DB_File, NDBM_File, etc). Связать хэш с базой можно разными способами - с помощью функций dbmopen или tie. use DB_File; use NDBM_File; О работе этих функций - perldoc -f dbmopen и perldoc -f tie. Работа с хэшем DBM-базы не отличается от работы с обычным хэшем. В принципе, этой информации о DBM-файлах достаточно. Structured Query Language. Структурированный язык запросов, а попросту - SQL - это тема для отдельной статьи и только косвенно связана с Перл. Мы же рассмотрим способы взаимодействия с SQL-образными базами данных. Самым удобным интерфейсом к БД является модуль DBI (нет в стандартной поставке Перл). DBI - это основной модуль интерфейса, к которому необходимо присовокупить (гусары, молчать!) драйвер для соответствующей базы данных. Не надо пугаться! Драйвер - это всего-лишь Perl-модуль. Для каждого типа БД модуль-драйвер будет иметь название DBD::basename: DBD::mysql, DBD::InterBase, DBD::mSQL и т.п. Проще говоря, вам нужно просто установить два модуля: DBI и DBD::НазваниеБазы. Впоследствии, для других типов БД ставить DBI заново уже не требуется. Список имеющихся у вас драйверов можно получить так: use DBI; Теперь о работе с DBI. use DBI; $db = DBI->connect("dbi:InterBase:database = /home/db/data.gdb; ib_dialect=3; ib_charset=win1251", "-login", "pass")|| die "$DBI::errstr"; Ошибки базы данных пишутся в DBI::errstr, откуда их можно запросто прочитать =). Работа с данными после подключения происходит следующим образом. $req=$db->do("CREATE TABLE USERS .......... "); # простые SQL-команды Метод finish вызывается для освобождения памяти, если ваш скрипт производит несколько запросов. Для работы с данными в DBI имеется множество методов. Например: $rv = $db->do($query); Для получения данных после запроса (после prepare и execute) имееются различные методы. @row = $req->fetchrow_array; $req=$db->prepare("SELECT NAMES,LASTNAMES FROM USERS WHERE AGE>18"); Можно сделать выборку в готовые переменные, которые выглядят нагляднее массивов и хэшей. Для этого нужно воспользоваться методом bind_columns и связать данные со ссылками на соответствующие переменные. $req=$db->prepare("SELECT NAMES,LASTNAMES FROM USERS WHERE AGE>18"); Список всех методов подробно описан в документации к DBI (perldoc DBI). Описание модуля, содержащееся в комплекте поставки, занимает около 150 килобайт. Подробнее документацию вы вряд ли найдете. Также полную информацию можно найти здесь: dbi.perl.org. Стоит еще упомянуть о расширениях модуля DBI. Они носят названия вида DBIx::***. Найти их можно на search.cpan.org. Кроме модуля DBI существует масса отдельных модулей для разных типов БД. Например, Mysql - для MySQL, IBPerl - для InterBase. Однако, по моему мнению, DBI является самым удобным интерфейсом, а главное - он присутствует практически на всех хостингах. Почему я не стал рассказывать подробно о работе с базами данных? Дело в том, что большинство проблем, возникающих при программировании под БД, появляется вследствие незнания принципов работы с БД, различий между различными их видами, что выходит за рамки изучения Перл. Ликбез по этой теме требует написания отдельных статей с рассмотрением конкретных типов БД. Я же не ставил перед собой такую задачу. Все, что нужно для программирования Perl+DB, - это книга по языку SQL, документация к вашей БД и perldoc DBI. Небольшой совет. Запросы к БД следует составлять в отдельной переменной, и эту переменную передавать пераметром в do(), prepare(). Таким образом можно легко разобраться, если произойдет ошибка. $query="SELECT NAMES,LASTNAMES FROM USERS WHERE AGE>18"; В следующей части статьи мы рассмотрим способы общения Perl-программ с пользователем, а именно - интерфейсы. Источник: "Компьютер Price", http://www.comprice.ru
| ||
Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com |