1

我正在尝试使用 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 ] }); 
}
4

2 回答 2

3

我知道您认为您想使用CGI.pm来生成表格,但您不应该这样做。代码会很丑,而且会很痛。

相反,将表示与逻辑分开。避免使用CGI.pm. 使用简单的模板模块,例如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 };
}
于 2012-05-16T14:17:59.743 回答
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)
       );
}
于 2012-05-16T14:07:23.720 回答