Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск значения в телe запроса, подскажите новичку 
:(
    Опции темы
ImSave
Дата 12.11.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



в переменной $request содержится тело запроса от браузера, например:
Код

User-Agent: OUser-Agent: Opera/9.51 (Windows NT 6.0; U; MRA 5.4 (build 02620); ru)
Host: cbuilder.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
....
Accept-Flags: flaf1, flag2;
...

нужно проверить существование в этом запросе поля Accept-Flags: и если да, то проверить есть ли в нем flag3 допустим. 

Спасибо заранее.

забыл... и после проверки удалить эту строку из $request.

Это сообщение отредактировал(а) ImSave - 12.11.2009, 16:21
PM MAIL   Вверх
arto
Дата 12.11.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



s#^Accept-Flags: .*flag2.*$##m && print "deleted";
PM MAIL ICQ   Вверх
ImSave
Дата 12.11.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



Цитата(arto @ 12.11.2009,  17:42)
s#^Accept-Flags: .*flag2.*$##m && print "deleted";

так??:
Код

if($request = s#^Accept-Flags: .*flag2.*$##m){
  #ок!
}

прошу прощения, но не могли бы вы расписать по подробнее. типа:
Код

if(поиск Accept-Flags:){
    #нашли
    if(поиск значения flag3){
      #ок!
    }
#удаляем всю строку
}

PM MAIL   Вверх
krypt3r
Дата 13.11.2009, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Попробуйте так
Код

if ($request =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
  # OK
}

PM MAIL   Вверх
ImSave
Дата 14.11.2009, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



Цитата(arto @ 12.11.2009,  17:42)
s#^Accept-Flags: .*flag2.*$##m && print "deleted";

чет не срабатывает =(

Добавлено через 1 минуту и 16 секунд
Цитата(krypt3r @ 13.11.2009,  06:43)
Попробуйте так
Код

if ($request =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
  # OK
}

Спасибо. работает так:
Код

if ($request->as_string =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
 #ok
}


теперь как удалить всю эту строчку?

Это сообщение отредактировал(а) ImSave - 14.11.2009, 23:59
PM MAIL   Вверх
arto
Дата 15.11.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# print -l User-Agent:\ Opera/9.51\ \(Windows\ NT\ 6.0\;\ U\;\ MRA\ 5.4\ \(build\ 02620\)\;\ ru\) Host:\ cbuilder.ru Accept:\ text/html,\ application/xml\;q=0.9,\ application/xhtml+xml,\ image/png,\ image/jpeg,\ image/gif,\ image/x-xbitmap,\ \*/\*\;q=0.1 Accept-Language:\ ru-RU,ru\;q=0.9,en\;q=0.8 Accept-Charset:\ iso-8859-1,\ utf-8,\ utf-16,\ \*\;q=0.1 .... Accept-Flags:\ flaf1,\ flag2\; ... | perl -0777 -plne 's#^Accept-Flags: .*flag2.*$##m && print "deleted"; '
deleted
User-Agent: Opera/9.51 (Windows NT 6.0; U; MRA 5.4 (build 02620); ru)
Host: cbuilder.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
....

...

PM MAIL ICQ   Вверх
ImSave
Дата 15.11.2009, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



Извиняюсь конечно..но я не понимаю как это применить...куча текста и что к чему?
PM MAIL   Вверх
arto
Дата 15.11.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



если вы захотите, то сможете разобраться.
PM MAIL ICQ   Вверх
ImSave
Дата 15.11.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



Цитата(arto @ 15.11.2009,  00:57)
если вы захотите, то сможете разобраться.

да. вы правы. Спасибо за старания!=)

Добавлено @ 13:01
Цитата(krypt3r @ 13.11.2009,  06:43)
Попробуйте так
Код

if ($request =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
  # OK
}

строка в теле запроса выглядит так: 
Код

Accept-Flags: flag1, flag2, flag3

далее пишу:
Код

if ($request->as_string =~ /Accept\-Flags:\s*(.+?)\n/){
  # ok. Accept-Flags found
  if($1 =~ /flag1/){print "->flag1 found\n";}
  if($1 =~ /flag2/){print "->flag2 found\n";}
  if($1 =~ /flag3/){print "->flag3 found\n";}
}

но получаю только:
Код

->flas1 found

т.е. только первый находит, а должен все. Что подправить?

Это сообщение отредактировал(а) ImSave - 15.11.2009, 13:04
PM MAIL   Вверх
amg
Дата 15.11.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ImSave @  15.11.2009,  12:55 Найти цитируемый пост)
т.е. только первый находит, а должен все. Что подправить?
Переменные $1, $2, ... ресетятся после каждого удачно сработавшего регулярного выражения. Потому так и получается. Исправить можно так:
Код
if ($request->as_string =~ /Accept-Flags:\s*(.+?)\n/){
  my $flags = $1; # ok. Accept-Flags found
  if($flags =~ /flag1/){print "->flag1 found\n";}
  if($flags =~ /flag2/){print "->flag2 found\n";}
  if($flags =~ /flag3/){print "->flag3 found\n";}
}

Цитата(ImSave @  14.11.2009,  23:58 Найти цитируемый пост)
теперь как удалить всю эту строчку?
Собственно, arto уже привел решение. В вашем коде первую строку нужно заменить на:
Код
if ($request->as_string =~ s/^Accept-Flags:\s*(.+?)$//ms){


PM MAIL   Вверх
ImSave
Дата 15.11.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



amg, спасибо работает.
А вот с удалением...ну не срабатывает =(((
вот пробую:
Код

if ($request =~ s/^Accept-Flags:\s*(.+?)$//ms){ #если написать $request->as_string то ошибка
  my $flags = $1; # ok. Accept-Flags found
  if($flags =~ /flag1/){print "->flag1 found\n";}
  if($flags =~ /flag2/){print "->flag2 found\n";}
  if($flags =~ /flag3/){print "->flag3 found\n";}
}
print $request->as_string, "\n"; #вижу Accept-Flags:


пробовал и:
Код

if ($request->as_string =~ /Accept-Flags:\s*(.+?)\n/){
  my $flags = $1; # ok. Accept-Flags found
  if($flags =~ /flag1/){print "->flag1 found\n";}
  if($flags =~ /flag2/){print "->flag2 found\n";}
  if($flags =~ /flag3/){print "->flag3 found\n";}
}
$request =~ s/^Accept-Flags:\s*(.+?)$//ms;
print $request->as_string, "\n"; #и снова вижу Accept-Flags:


PM MAIL   Вверх
krypt3r
Дата 16.11.2009, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Если уж пошла такая пляска, то
Код

if (my ($flags) = $request =~ /Accept-Flags:\s*(.+?)\n/){
  print "->flag1 found" if $flags =~ /flag1/;
  print "->flag2 found" if $flags =~ /flag2/;
  print "->flag3 found" if $flags =~ /flag3/;
}

Вариант удаления 
Код

$request =~ s/^Accept-Flags:\s*(.+?)$//ms;

оставит пустое место между строками
Код

User-Agent: OUser-Agent: Opera/9.51 (Windows NT 6.0; U; MRA 5.4 (build 02620); ru)
Host: cbuilder.ru                                                                 
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1                                                     
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8                                                 
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1                                       
....                                                                                     

Referer: http://google.ru
...                      

Лучше уж
Код

$request =~ s/^Accept-Flags:\s*(.+?)\n//m;

PM MAIL   Вверх
ImSave
Дата 16.11.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



Ребят, всем спасибо за помощь,
но я вот не пойму, только на до мной Perl издевается?!
вот для теста:
Код

print $request->as_string, "\n"; #ок.норм.вижу Accept-Flags:
$request =~ s/^Accept-Flags:\s*(.+?)$//ms; #пытаюсь удалить ее. 
# пробовал и  $request =~ s/^Accept-Flags:\s*(.+?)\n//m;
print $request->as_string, "\n"; #и снова вижу строку Accept-Flags:. Ну не удаляется она и все тут!

что ж такое то smile 

Это сообщение отредактировал(а) ImSave - 16.11.2009, 12:29
PM MAIL   Вверх
ginnie
Дата 16.11.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



ImSave, $request - это объект HTTP::Request, поэтому, чтобы удалить заголовок, надо использовать

Код

$request->remove_header('Accept-Flags');


т.е.

Код

if ($request->header('Accept-Flags') =~ /flag3/) {
    $request->remove_header('Accept-Flags');
}



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ImSave
Дата 16.11.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 4.9.2009

Репутация: нет
Всего: нет



ну наконец-то. ginnie, СПАСИБО огромное.  smile   smile   smile 
Вот код который меня устраивает:
Код

if ($request->header('Accept-Flags') =~ /flag1/){ print "->flag1 found\n"};
if ($request->header('Accept-Flags') =~ /flag2/){ print "->flag2 found\n"};
if ($request->header('Accept-Flags') =~ /flag3/){ print "->flag3 found\n"};
$request->remove_header('Accept-Flags');
print $request->as_string, "\n"; #отлично! Удаляет.

и я так понимаю проверку на Accept-Flags вначале можно не делать, поскольку никакого исключения не вылетит?!

Это сообщение отредактировал(а) ImSave - 16.11.2009, 13:26
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4294 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.