我正在尝试使用CGI.pm创建一个表。该表将包含来自的结果 查询数据库。数组final包含查询所在的记录号 被执行。每条记录的结果应该在一个单独的行中。结果 记录上的每个查询应该在行中形成一列。使用我发现的一些代码 here,我写了以下内容 (这可能不是他最好的方式):
#!/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)
);
}
当我运行它时,我得到一个空白页面并出现错误“Undefined subroutine& main :: td” 在错误日志中。为什么我会收到此错误,我该如何摆脱它?有没有 用CGI.pm创建表我想要的表的其他方法? 任何帮助,将不胜感激。谢谢!
编辑:使用Sinan的建议,我修改了我的代码如下:
#!/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 ] });
}
答案 0 :(得分:3)
我知道您认为您希望使用CGI.pm来生成表格,但您不应该这样做。代码将是丑陋的,它会受到伤害。
相反,将表示与逻辑分开。避免CGI.pm
的HTML生成功能。使用简单的模板模块,例如HTML::Template。根据您的内容自定义HTML而不会弄乱您的代码。
鉴于您的问题更新,我认为您需要的是:
foreach my $el (@final) {
my @cells;
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 @cells, { CELL => $rec };
}
}
push @rows, { CELLS => \@cells };
}
答案 1 :(得分:2)
尝试使用“use CGI qw(:standard);
”代替“use CGI;
”。否则,不导入CGI模块的命名空间。
另一种方法是使用“push(@rows,CGI->td($rec))
”代替“td()
”。
这也适用于tr(\@rows)
这是完整的工作代码:
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:standard);
use DBI;
...
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,td($rec));
}
}
print table({-border=>undef,-width=>'25%'},
tr(\@rows)
);
}