Это не ответ на ваш вопрос, а общий совет.Поэтому я сделал это вики-сообществом.
Пожалуйста, прекратите писать сценарии CGI на некоторое время, пока не поймете, почему у вашего сценария есть серьезные проблемы.
У вас есть:
use CGI;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
# ...
my $query = new CGI;
my $q = new CGI;
Во-первых, обратите внимание, что вам нужно инициализировать объект CGI только один раз.Избегайте косвенных вызовов методов:
my $cgi = CGI->new;
Я знаю, что документы CGI.pm используют $query
, но я считаю $cgi
более значимым.
Это хороший шаг.Почти все CGI-скрипты должны использовать хорошо зарекомендовавшие себя библиотеки, а не доморощенный код.Тем не менее, после этого хорошего первого шага вы делаете:
print "Content-Type: text/html\n\n";
$query = $ENV{'QUERY_STRING'};
@list = split( /\&/, $query);
foreach (@list) {
($var, $val) = split(/=/);
$val =~ s/\'//g;
$val =~ s/\+/ /g;
$val =~ s/%(\w\w)/sprintf("%c", hex($1))/ge;
($var, ' = ', $val,);
}
Нет никаких оснований заниматься практикой культа груза.Ваш объект CGI уже имеет параметры, переданные в сценарий.
Кроме того, вы должны объявить свои переменные там, где они впервые используются, а не выводить их все в сценарии.
Использовать CGI.вечера header
, чтобы отправить заголовок.У вас есть:
print <<END_HTML;
<html>
<head><title></title>
</head>
<body>
<form action="Filtering.cgi" method="post">
<TABLE>
<TR>
<TD>
<input type="hidden" name="submit" value="Submit">
</TD>
</TR>
</TABLE
</form>
</body></html>
END_HTML
, который не имеет смысла, поскольку вы отправили полный HTML-документ, прежде чем делать что-либо в скрипте.
Остальная часть кода не может изменить то, что вы уже отправили.
Поместите ваш HTML в шаблон.Лично мне нравится HTML :: Template для четкого разделения между кодом и контентом.
Таким образом, вы можете написать свой Perl-скрипт для генерации контента и включить любые функции на стороне клиента вШаблон отдельно.