使用Perl CGI.pm的表

时间:2012-05-16 14:00:48

标签: perl html-table cgi

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

2 个答案:

答案 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)
       );
}