Автор Тема: Поиск  (Прочитано 7700 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Biggelow

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
Поиск
« : 18 Мая 2005, 14:14:20 »
Пишу:

#!/usr/bin/perl

use CGI;

$cgi=new CGI;

$search=$cgi->param(\'go\');

$gde="http://www.nwcinema.ru/cgi-bin/search/searchstring.cgi";

my $search = $cgi->escape($cgi->param(\'go\'));

print "Location: http://site/cgi-bin/search/searchstring.cgi?go&searchstring=$search\\n\\n";

На выходе получаю:

http://site/cgi-bin/search/searchstring.cgi?go&searchstring=CGI%3DHASH%280x80fbb4c%29

Чего за фигня, может кто знает. Только без почитай perldoc.

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Поиск
« Ответ #1 : 18 Мая 2005, 14:31:13 »
Упс... perldoc почитать все же советую, но этим не ограничусь.

Вы смысл вот этих строк хорошо понимаете?

my $search = $cgi->escape($cgi->param(\'go\'));

$search=$cgi->param(\'go\');

зачем два раза вызывать param?


use CGI;

my $cgi=new CGI;

my $search=$cgi->param(\'go\');

my $gde="http://www.nwcinema.ru/cgi-bin/search/searchstring.cgi";

$search = $cgi->escape($search);

print "Location: $gde?searchstring=$search\\n\\n";

exit 0;



попробуйте так.
« Последнее редактирование: 18 Мая 2005, 14:36:31 от cr4ck3r »
Ворота в perl - perlmonks.org.ru

Оффлайн Biggelow

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
Поиск
« Ответ #2 : 18 Мая 2005, 16:57:34 »
Сейчас на выходе вообще по нулям. Param первый раз проверял на пустоту строчку, а сейчас просто - flash это проверяет.

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Поиск
« Ответ #3 : 19 Мая 2005, 09:58:35 »
Ну так на пустоту строку param\'ом проверять - это по меньшей мере странно.
Лучше делать так:

use CGI;

my $cgi=new CGI;
if(!$cgi->param(\'go\')) {# если ничего не передано

} else {
my $search=$cgi->param(\'go\'); }

или так:

use CGI;

my $cgi=new CGI;

my $search=lc($cgi->param(\'go\'));# lc избавляет от неинициализированных ошибках в логах апача

if($search eq "") {
print "Ничего не передано";
} else {
print "Передано $search";
}

И что значит - "по нулям" ?
Ворота в perl - perlmonks.org.ru

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Поиск
« Ответ #4 : 19 Мая 2005, 12:18:43 »
Цитировать
cr4ck3r:
} else { my $search=$cgi->param(\'go\'); }

Обьявить $search следует раньше, иначе переменная не будет доступна.
The documentations is your friend

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Поиск
« Ответ #5 : 19 Мая 2005, 12:42:26 »
cr4ck3r
if($search eq "")  = if (!$search) ?

и вообще... :
my $search=param(\'go\') if (param(\'go\'));
And no religion too...

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Поиск
« Ответ #6 : 19 Мая 2005, 18:07:02 »
Цитировать
NeoNox:
cr4ck3r:
} else { my $search=$cgi->param(\'go\'); }


Обьявить $search следует раньше, иначе переменная не будет доступна.

Да - это обязательно! (просто просмотрел)

2commander:
если в скрипт не передаются никакие параметры - а в скрипте идет типа
$search=param(\'go\');
то в логи апача (только на никсах - на винде все чисто) будет сыпаться - Use unitilizated value .. bla bla bla.
А функция lc - превращает undef значение в "" пустую строку.
Ворота в perl - perlmonks.org.ru

Оффлайн Biggelow

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
Поиск
« Ответ #7 : 20 Мая 2005, 08:30:03 »
По нулям значит строка на выходе:
http://site/cgi-bin/search/searchstring.cgi?go&searchstring=
Т.е. ничего.

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Поиск
« Ответ #8 : 20 Мая 2005, 09:27:18 »
Покажи свой скрипт полностью, тогда будет понятней (скорее всего ты перед тем как вывести Location выводишь Content-Type)
Ворота в perl - perlmonks.org.ru

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Поиск
« Ответ #9 : 20 Мая 2005, 10:05:45 »
cr4ck3r
Use of uninitialized value будет только на использование переменной со значением undef, а не на прием переменной "$search=param(\'go\');"
А использовать функцию lc это значит лишний раз нагружать компилятор преобразованием питов... что не правильно!
And no religion too...

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Поиск
« Ответ #10 : 20 Мая 2005, 11:17:47 »
2commander:
Ну так после такой конструкции:

my $search=param(\'go\') if(param(\'go\'));
print $search;

Уже будут в логах записи. А если пытаться сделать проверку на допустимые аргументы (к примеру так:
$search=~s/[^a-z]//;
то опять ошибки.

Можно конечно делать типа так:
if(!param()) {
print "Что-то"; }
else {
print param...
}

Но если хотите грамотно избежать таких конструкций - то рекомендуется использовать функции типа lc или uc. Это не я придумал - так рекомендуют в хороших книгах. Либо вы полностью дампите (функция Vars) все переданные параметры в хэш - и дальше уже работаете с ним. В принципе для скриптов с большим кол-вом переменных в запросах - лучше так и поступать.
Ворота в perl - perlmonks.org.ru

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Поиск
« Ответ #11 : 20 Мая 2005, 15:06:35 »
cr4ck3r
Цитировать
Ну так после такой конструкции:

my $search=param(\'go\') if(param(\'go\'));
print $search;

Уже будут в логах записи.

запись в логах будет на строку print $search; компилятор подсказывает программисту о использовании неинициализированной переменной, что правильно, а вот что точно не привильно это использовать функции которые такие записи в логах уберают да и к тому же нагружают компилятор преобразованием типов.

Цитировать
Это не я придумал - так рекомендуют в хороших книгах.

разрешите поинтересоваться что же это за книги...?

P.S. не надо учить людей изначально не правильному стилю программирования, ибо начинающий программист прользуясь подобными методами усложнит себе процес дебага в разы!
And no religion too...

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Поиск
« Ответ #12 : 21 Мая 2005, 00:22:08 »
Что-то я не понял, а что мешает сделать так:
my $search=param(\'go\') || "";
lc какие-то придумывают.

P.S. про ноль говорить не нужно %)
There Is More Than One Way To Do It (c)

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Поиск
« Ответ #13 : 23 Мая 2005, 10:03:05 »
>>разрешите поинтересоваться что же это за книги...?
DDuBois P. MySQL and Perl for the Web, New Riders, 2001 г. - 552 с.

Вообще - такой записи в логах не будет если убрать ключ -w из первой строки ;-).
В некоторых случаях неинициализировнные переменные ВСЕ равно будут (это может быть связано с использованием модулей в которых немного криво написан код к примеру).
Ворота в perl - perlmonks.org.ru

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Поиск
« Ответ #14 : 23 Мая 2005, 13:14:03 »
cr4ck3r
Цитировать
Вообще - такой записи в логах не будет если убрать ключ -w из первой строки ;-).
В некоторых случаях неинициализировнные переменные ВСЕ равно будут (это может быть связано с использованием модулей в которых немного криво написан код к примеру).

флэйм...
And no religion too...

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28