我是perl的新手,对使用模块没有太多的想法。 我正在尝试通过perl创建ouput.html文件。基本上,perl为我的工作提供了一些实验的一些数据行。我正在使用这些结果,并使用HTML :: table创建一个表。使其成为一种仪表板。下面是我的代码。由于我无权访问服务器来创建网页。我正在尝试创建一个可以用Web浏览器打开的html文件。
use strict;
use warnings;
use feature "say";
use HTML::Table;
my $table1= new HTML::Table(-cols => 9,
-align => 'centre',
-rules => 'rows',
-border => "1",
-bgcolor => '#A6DBF7',
-width => '80%',
-spacing => 1,
-padding => 5,
-style => 'color:black',
-class => 'myclass',
-head => ['Block Name','Owner','Handoff','Covg-SA','SA-Patterns','Covg-TFT','TFT-Patterns','Fullscan-SA','Fullscan-TFT']);
open my $HTML,'>' ,'output.html' or die $!;
print $HTML "$table1\n";
for my $i (0..50) {
sub_call()
}
sub sub_call{
...bla..bla
..bla...bla...
.bla....
my @row=('$block','$uid','$step',,'$compress_SA_cvg','$temp','$compress_TFT_cvg','$logic_patt','$fullscan_SA_cvg','$fullscan_TFT_cvg');.
my $table1= new HTML::Table(-cols => 9,
-align => 'centre',
-rules => 'rows',
-border => "1",
-bgcolor => '#DAF7A6',
-width => '80%',
-spacing => 1,
-padding => 5,
-style => 'color:black',
-class => 'myclass',
);
$table1->addRow(@row);
open my $HTML,'>>' ,'output.html' or die $!;
print $HTML "$table1\n";
}
在上面的代码中。每次第二块执行时,我都会在数组 @row 中有一行数据。它将被附加到output.html。我的要求如下。
我已附上我得到的输出的屏幕截图。出于安全原因,我将变量值保持不变。但是,当我获取变量的值时,该表将无法正确对齐。
请建议我使用什么来满足上述要求。
谢谢。
答案 0 :(得分:1)
如评论中所述,使用Perl创建HTML的最佳方法是使用模板系统。有很多可能的选择,但是我在演示使用模板工具包的原理
这是Perl代码。它只是创建数据,而将HTML的创建留给模板系统。
#!/usr/bin/perl
use strict;
use Template;
my $template=Template->new({PRE_CHOMP => 1});
my @rows;
push @rows,["a","b","c","d","e"];
push @rows,["a","b","c","d","e"];
push @rows,["a","b","C","d","e"];
push @rows,["a","b","c","d","e"];
$template->process("table.tmpl",{rows => \@rows}) || die $template->error();
模板(table.tmpl)如下。
<html>
<head>
<title>My Table</title>
<style>
table { border-collapse: collapse; border: solid 1px black; }
th { border: solid 1px black; background: #A6DBF7; text-align: center; color: black; }
td { border: solid 1px black; background: #DAF7A6; text-align: center; color: black; }
</style>
</head>
<body>
<table>
<tr><th>Heading</th><th>Another</th><th>More</th><th>Heading!</th><th>Blah</th></tr>
[% FOREACH row IN rows %]
<tr>
<td>[% row.0 %]</td>
<td>[% row.1 %]</td>
<td style="background: [% IF row.2=='c'%]green[% ELSE %]red[%END %];">[% row.2 %]</td>
<td>[% row.3 %]</td>
<td>[% row.4 %]</td>
</tr>
[% END %]
</table>
</body>
</html>
如您所见,您可以在模板中放置一些有关输出外观的逻辑-第三列的背景取决于行中第三元素的值。
答案 1 :(得分:1)
我不赞成HTML :: Table,因为它已经十多年未见任何更新,并且使用了非常过时的概念。请参阅下面的更多内容。
您的问题是,每次调用子例程中的一行数据时,您都会创建一个新的HTML :: Table object ,并且对于表头也使用了另一个。基本上,您的代码如下所示:
use strict;
use warnings;
use HTML::Table;
my $table_header = HTML::Table->new(
-cols => 2,
-head => [qw/ foo bar/],
);
print $table_header;
for ( 1, 2 ) {
my $table_data = HTML::Table->new( -cols => 2, );
$table_data->addRow( 1, 2 );
print $table_data;
}
此代码产生以下输出。
<table>
<tbody>
<tr><th>foo</th><th>bar</th></tr>
</tbody>
</table>
<table>
<tbody>
<tr><td>1</td><td>2</td></tr>
</tbody>
</table>
<table>
<tbody>
<tr><td>1</td><td>2</td></tr>
</tbody>
</table>
如您所见,这与标题不对齐具有相同的问题。发生这种情况是因为这些表是单独的表,并且您的浏览器会单独呈现每个表。如果没有其他说明,它将尝试为每个表找到最佳的列大小。这将使它们彼此不对齐。甚至有可能某些数据行最终无法相对于上下一行正确对齐。
相反,您只需要制作一个HTML :: Table对象,并继续将其用作标题以及数据的每行
。use strict;
use warnings;
use HTML::Table;
my $table = HTML::Table->new(
-cols => 2,
-head => [qw/ foo bar/],
);
for ( 1, 2 ) {
$table->addRow( 1, 2 );
}
print $table;
现在输出将如下所示
<table>
<tbody>
<tr><th>foo</th><th>bar</th></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
</tbody>
</table>
在您的代码中,不需要对sub_call
的子例程调用,您可以直接在循环中使用该代码。摆脱那里的新HTML :: Table对象,并重复使用标题中的一个。请记住,词汇变量(用my
声明)仅在其当前 scope 中有效。这意味着,如果您在{
和}
之间声明一个变量,则该变量在该块之外不可见。
要使背景色不同,请查看at the documentation regarding sections。这是一个 外观的快速模型。
use strict;
use warnings;
use HTML::Table;
my $table = HTML::Table->new(
-cols => 2,
);
$table->addSectionRow( 'thead', 0, qw/foo bar/ );
$table->setSectionStyle('thead', 0, 'background-color: red');
$table->setSectionRCellsHead('thead', 0, 1);
$table->setSectionStyle('tbody', 0, 'background-color: green');
for ( 1, 2 ) {
$table->addSectionRow( 'tbody', 0, 1, 2 );
}
print $table;
该代码将产生这样的输出
<table>
<thead style="background-color: red">
<tr><th>foo</th><th>bar</th></tr>
</thead>
<tbody style="background-color: green">
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
</tbody>
</table>
如您所见,它产生的内容非常复杂。正如我之前在评论中所说,最好编写自己的HTML。最好使用模板系统。请the answer by Chris Turner。