![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
justauser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.9.2014 Репутация: нет Всего: нет |
Начал разбираться с Perl (я не программист) и для тренировки решил написать простейший http сервер без использования спец. модулей. Пока получилось сделать сетевую чась (минимально). Сервер слушает порт 80, принимает подключения, форкается и выдает прописанный в скрипте index.html не разбирая запрос. Это работает в браузере, я проверил. Но запрос может быть на разные страницы поэтому его нужно разобрать на отдельные переменные. Пока я его просто печатаю в консоли
GET / HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:32.0) Gecko/20100101 Firefox/32.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive а нужно все параметры разделить по отдельным переменным, но не соображу как. Можете написать пример? Запрос получаю $count = sysread(FH, $data, 1400); вот $data и нужно разобрать. p.s. Заодно проверьте пожалуйста на ошибки то что я уже сделал
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -MData::Dumper -le 'print Dumper do { local$/="";my%a=map{split":? ",$_,2}split"\r?\n",<STDIN>;\%a}'
$VAR1 = { 'User-Agent' => 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:32.0) Gecko/20100101 Firefox/32.0', 'Accept-Language' => 'en-US,en;q=0.5', 'Accept-Encoding' => 'gzip, deflate', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'GET' => '/ HTTP/1.1', 'Connection' => 'keep-alive', 'Host' => 'localhost' }; # |
|||
|
||||
justauser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.9.2014 Репутация: нет Всего: нет |
Спасибо но мне без доп модулей нужно. А Data::Dumper отдельный модуль. Как можно $data разобрать стандартными средствами?
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
оно разбирает стандартными средствами, а Dumper выводит в удобоваримом виде.
|
|||
|
||||
justauser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.9.2014 Репутация: нет Всего: нет |
По вашему предложению сделал такой тестовый скрипт для разбора, вроде работает. Наверняка можно проще.
|
|||
|
||||
noize |
|
||||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: 3 Всего: 3 |
1. Добавьте пробелов в строки, иначе всё сливается в ###код
2. Используйте прагмы strict и warnings, не стоит начинать изучение языка с хардкора
возьмите \r в скобки -
|
||||
|
|||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
а для чего (\r) ?
|
|||
|
||||
noize |
|
|||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: 3 Всего: 3 |
думал, что интерпретатор может воспринять "\r" как 2 символа - "\" и "r" и тогда условие \r? проверяло бы на существование только 'r'. Сейчас проверил у себя локально - воспринимает как единый символ, так что скобка там в принципе не обязатальна, да.
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
оно ещё и неверно работает:
# print "aa\r\nbb\r\n" | perl -0777 -lne 'print join "+", split "(\r)?\n"' +bb+ # print "aa\r\nbb\r\n" | perl -0777 -lne 'print join "+", split "\r?\n"' aa+bb # |
|||
|
||||
justauser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.9.2014 Репутация: нет Всего: нет |
Сделал вариант с хэшем тоже работает.
Но при доп. тестировании выявилась проблема с разбором если параметр объявлен но его значения в запросе нет. GET / HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:32.0) Gecko/20100101 Firefox/32.0 Accept: Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Оба скрипта тогда неправильно работают. Получается нужно при разделении строки на поля проверять чтоб было обязательно два поля и если значение не задано нужно удалять всю строку или подставлять что-то свое типа "Undefined!" Не соображу как, может кто подскажет. |
|||
|
||||
noize |
|
||||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: 3 Всего: 3 |
Строки с 11 по 32 можно заменить так:
тернарный оператор
проверяет наличие в массиве значения для ключа $key и печатает это значение. Если значения нет, печатает "Undef" Это сообщение отредактировал(а) noize - 23.9.2014, 14:53 |
||||
|
|||||
hobo1mts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 21.6.2013 Репутация: нет Всего: 1 |
Это ж классика жанра
Тут ещё нада добавить проверку длинных строк, которые продолжаются на следующей строке, начинаясь с пробельного символа. |
|||
|
||||
DProf |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.9.2012 Репутация: 1 Всего: 1 |
Вообще для "не программиста" начинать изучение языка с написания http сервера, пусть и простого, странно, ИМХО. Возьмите лучше книжку с Ламой и сделайте задания-примеры ко всем главам. А потом ее вторую часть.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |