Во-первых, вы должны включить предупреждений . Если бы вы сделали это, вы бы заметили, что вы должны использовать $row[1]
, $row[2]
... для доступа к отдельным элементам @row
. @row[0]
создает срез массива из одного элемента.
Во-вторых, было бы полезно отделить логику от представления с помощью шаблонного модуля, такого как HTML :: Template . Смешивание циклов while
с heredoc делает код нечитаемым.
Вы можете получить доступ к значениям параметров, переданным в ваш скрипт, с помощью пакета обработки формы CGI. В настоящее время я предпочитаю использовать CGI :: Simple , а не CGI.pm , поскольку CGI::Simple
имеет более разумные значения по умолчанию и не имеет багажа для генерации HTML, который поставляется с CGI.pm
.
use strict; use warnings;
use CGI::Simple;
my $cgi = CGI::Simple->new;
my $pname = $cgi->param('pname');
Наконец, имейте в виду, что вам по-прежнему нужно проверять 'pid', даже если в форме он указан как readonly
. Я также рекомендовал бы использовать CGI :: Application , чтобы предоставлять обработчики для различных действий, а не иметь разные сценарии для каждого.
Вот простой пример:
#!perl
use strict; use warnings;
use CGI::Simple;
use HTML::Template;
my $cgi = CGI::Simple->new;
# For demo purposes only. I would use CGI::Application
$cgi->param ? process_form($cgi) : show_form($cgi);
sub process_form {
my ($cgi) = @_;
print $cgi->header('text/plain'),
sprintf("%s : %s\n",
$cgi->param('pid'),
$cgi->param('pname'),
)
;
return;
}
sub show_form {
my ($cgi) = @_;
my $tmpl = HTML::Template->new(scalarref => template() );
$tmpl->param(
PRODUCTS => [
{ PID => '1234', PNAME => 'Widget' },
{ PID => '4321', PNAME => 'Wombat' },
]
);
print $cgi->header, $tmpl->output;
return;
}
sub template {
return \ <<EO_TMPL;
<!DOCTYPE HTML>
<html><head><title>Test</title></head>
<body>
<TMPL_LOOP PRODUCTS>
<form method="POST">
<p><input name="pid" readonly="1" value="<TMPL_VAR PID>">
<input name="pname" value="<TMPL_VAR PNAME>"><input
type="submit" value="Update"></p></form>
</TMPL_LOOP>
</body>
</html>
EO_TMPL
}