İlk olarak, warnings açmalısınız. Bunu, size kullanması gerektiğini $row[1], $row[2] ... @row elemanlara tek tek erişmek için fark olurdu yapmıştı. @row[0] tek elemanlı dizi dilim oluşturur.
İkincisi, bu tür HTML::Template gibi bir çiftleşmiş modülü kullanarak sunum mantığı ayıran yararlanacak. Sahip while yorumlu metinler okunamaz kodunu yapmak ile karışık döngüler.
Bir CGI form işleme paketini kullanarak komut geçirilen parametre değerlerini erişebilirsiniz. Bu gün, ben CGI::Simple Saner varsayılan vardır ve ile birlikte HTML nesil bagaj yok, çünkü CGI.pm kullanmak CGI::Simple yerine tercih {[(3) }].
use strict; use warnings;
use CGI::Simple;
my $cgi = CGI::Simple->new;
my $pname = $cgi->param('pname');
Son olarak, bu formda readonly olarak belirtilen olsa bile hala 'pid' doğrulamak gerektiğini akılda tutmak. Ben de yerine her biri için farklı bir komut dosyası olan daha çeşitli eylemler için işleyicileri sağlamak için CGI::Application kullanarak öneriyoruz.
İşte basit bir örnek:
#!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
}