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