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を使用してテーブルを作成する他の方法はありますか?どんな助けでもいただければ幸いです。ありがとう!

編集: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:私はSinanの答えを受け入れていますが、その間に私は独自のソリューションを開発しました(誰かが興味を持っている場合に備えて):

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を使用してテーブルを生成したいとお考えの方もいらっしゃると思いますが、そうすべきではありません。コードは醜くなり、傷つきます。

代わりに、プレゼンテーションをロジックから分離してください。のHTML生成関数は避けてくださいCGI.pmHTML::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モジュールの名前空間はインポートされません。

もう1つの方法は、「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 に答える