Как создать HTML-таблицу с помощью Perl - PullRequest
0 голосов
/ 05 ноября 2018

Я новичок в Perl и не очень разбираюсь в использовании модулей. Я пытаюсь создать файл ouput.html через Perl. В основном Perl дает мне несколько строк данных для нескольких экспериментов в моей работе. Я использую эти результаты и создаю таблицу, используя HTML :: table. Чтобы сделать это своего рода приборной панелью. Ниже мой код. Так как у меня нет доступа к серверу для создания веб-страницы. Я пытаюсь создать 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 каждый раз, когда будет выполняться 2-й блок. который будет добавлен к output.html. У меня есть несколько требований, как показано ниже.

  • каждая клетка должна иметь границу
  • для 3-го и 5-го столбцов, фон ячейки должен зависеть от их значений.
  • вся таблица должна быть аккуратно выровнена по центру (значения, относящиеся к заголовкам, должны быть ниже этого заголовка).

Я приложил скриншот полученного вывода. По соображениям безопасности я оставил значения переменных как есть. Но когда я получу значения переменной, эта таблица не будет правильно выровнена.

screenshot of output

Пожалуйста, предложите мне, что использовать для удовлетворения вышеуказанных требований.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я не одобряю HTML :: Table, поскольку он не видел обновлений более 10 лет и использует очень устаревшие концепции. Подробнее об этом см. Ниже.


Ваша проблема в том, что вы создаете новый HTML :: Table объект каждый раз, когда вызываете подпрограмму для ряда данных, а также используете другую для заголовка таблицы. По сути ваш код выглядит так:

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 . Это означает, что если вы объявляете переменную между { и }, она не видна за пределами этого блока.

Чтобы получить разные цвета фона, посмотрите документацию по разделам . Вот краткий макет того, как может выглядеть.

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. Еще лучше использовать систему шаблонов. Пожалуйста, ответ Криса Тернера за это.

0 голосов
/ 05 ноября 2018

Как уже упоминалось в комментариях, лучший способ создать HTML с помощью Perl - это использовать систему шаблонов. Есть много возможных вариантов, но я демонстрирую принцип, используя Template Toolkit

Вот код 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>

Как видите, вы можете поместить некоторую логику того, как выходные данные выглядят в шаблоне - фон 3-го столбца зависит от значения 3-го элемента в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...