我正在尝试使用 CGI.pm 创建一个表。该表将包含查询数据库的结果。数组 final 包含将在其上执行查询的记录号。每条记录的结果应位于单独的行中。记录上每个查询的结果应该在行中形成一列。使用我在这里找到的一些代码 ,我编写了以下内容(这可能不是他最好的方法):
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use DBI;
...
my @rows;
my $rec;
foreach my $el (@final) {
@rows = ();
foreach my $query (@queries) {
my $query_handle = $connxn->prepare($query);
$query_handle->execute($el);
$query_handle->bind_columns(undef, \$rec);
while($query_handle->fetch()) {
push(@rows,td($rec));
}
}
print $q->table({-border=>undef,-width=>'25%'},
Tr(\@rows)
);
}
当我运行它时,我在错误日志中得到一个空白页和一个错误“未定义的子例程 &main::td”。为什么我会收到此错误,我该如何摆脱它?有没有其他方法可以使用 CGI.pm 创建我想要的表?任何帮助,将不胜感激。谢谢!
编辑:使用思南的建议,我修改了我的代码如下:
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use Carp;
use HTML::Template;
...
my @rows;
my $rec;
foreach my $el (@final) {
foreach my $query (@queries) {
my $query_handle = $connxn->prepare($query);
$query_handle->execute($el);
$query_handle->bind_columns(undef, \$rec);
while($query_handle->fetch()) {
push(@rows, { CELLS => [ map { CELL => $_ }, $rec ] });
}
}
}
my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(ROWS => \@rows);
print $tmpl->output;
__DATA__
<table>
<TMPL_LOOP ROWS>
<tr>
<TMPL_LOOP CELLS>
<td><TMPL_VAR CELL></td>
</TMPL_LOOP>
</tr>
</TMPL_LOOP>
</table>
但是现在我在单独的行中获得每个查询的结果,而不是同一行(参见上面的原始问题)。我似乎无法自己修复它。有任何想法吗?
EDIT2:虽然我接受了思南的回答,但同时我开发了自己的解决方案(以防有人感兴趣):
my @rows;
my @rows1;
foreach my $el (@final) {
@rows = ();
foreach my $query1 (@queries) {
my $query_handle = $connxn->prepare($query1);
$query_handle->execute($el);
$query_handle->bind_columns(undef, \$rec);
while($query_handle->fetch()) {
push(@rows, $rec);
}
}
push(@rows1, { CELLS => [ map { CELL => $_ }, @rows ] });
}