Forum Webscript.Ru
Программирование => Perl => Тема начата: Biggelow от 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.
-
Упс... 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;
попробуйте так.
-
Сейчас на выходе вообще по нулям. Param первый раз проверял на пустоту строчку, а сейчас просто - flash это проверяет.
-
Ну так на пустоту строку 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";
}
И что значит - "по нулям" ?
-
cr4ck3r:
} else { my $search=$cgi->param(\'go\'); }
Обьявить $search следует раньше, иначе переменная не будет доступна.
-
cr4ck3r
if($search eq "") = if (!$search) ?
и вообще... :
my $search=param(\'go\') if (param(\'go\'));
-
NeoNox:
cr4ck3r:
} else { my $search=$cgi->param(\'go\'); }
Обьявить $search следует раньше, иначе переменная не будет доступна.
Да - это обязательно! (просто просмотрел)
2commander:
если в скрипт не передаются никакие параметры - а в скрипте идет типа
$search=param(\'go\');
то в логи апача (только на никсах - на винде все чисто) будет сыпаться - Use unitilizated value .. bla bla bla.
А функция lc - превращает undef значение в "" пустую строку.
-
По нулям значит строка на выходе:
http://site/cgi-bin/search/searchstring.cgi?go&searchstring=
Т.е. ничего.
-
Покажи свой скрипт полностью, тогда будет понятней (скорее всего ты перед тем как вывести Location выводишь Content-Type)
-
cr4ck3r
Use of uninitialized value будет только на использование переменной со значением undef, а не на прием переменной "$search=param(\'go\');"
А использовать функцию lc это значит лишний раз нагружать компилятор преобразованием питов... что не правильно!
-
2commander:
Ну так после такой конструкции:
my $search=param(\'go\') if(param(\'go\'));
print $search;
Уже будут в логах записи. А если пытаться сделать проверку на допустимые аргументы (к примеру так:
$search=~s/[^a-z]//;
то опять ошибки.
Можно конечно делать типа так:
if(!param()) {
print "Что-то"; }
else {
print param...
}
Но если хотите грамотно избежать таких конструкций - то рекомендуется использовать функции типа lc или uc. Это не я придумал - так рекомендуют в хороших книгах. Либо вы полностью дампите (функция Vars) все переданные параметры в хэш - и дальше уже работаете с ним. В принципе для скриптов с большим кол-вом переменных в запросах - лучше так и поступать.
-
cr4ck3r
Ну так после такой конструкции:
my $search=param(\'go\') if(param(\'go\'));
print $search;
Уже будут в логах записи.
запись в логах будет на строку print $search; компилятор подсказывает программисту о использовании неинициализированной переменной, что правильно, а вот что точно не привильно это использовать функции которые такие записи в логах уберают да и к тому же нагружают компилятор преобразованием типов.
Это не я придумал - так рекомендуют в хороших книгах.
разрешите поинтересоваться что же это за книги...?
P.S. не надо учить людей изначально не правильному стилю программирования, ибо начинающий программист прользуясь подобными методами усложнит себе процес дебага в разы!
-
Что-то я не понял, а что мешает сделать так:
my $search=param(\'go\') || "";
lc какие-то придумывают.
P.S. про ноль говорить не нужно %)
-
>>разрешите поинтересоваться что же это за книги...?
DDuBois P. MySQL and Perl for the Web, New Riders, 2001 г. - 552 с.
Вообще - такой записи в логах не будет если убрать ключ -w из первой строки ;-).
В некоторых случаях неинициализировнные переменные ВСЕ равно будут (это может быть связано с использованием модулей в которых немного криво написан код к примеру).
-
cr4ck3r
Вообще - такой записи в логах не будет если убрать ключ -w из первой строки ;-).
В некоторых случаях неинициализировнные переменные ВСЕ равно будут (это может быть связано с использованием модулей в которых немного криво написан код к примеру).
флэйм...