HTML::Template + информация из БД [SOLVED]

Приветствую всех. Столкнулся с такой проблемой: Создаю шаблон

my $table = HTML::Template->new(filename => './templates/table.htm');
$table->param(USER_INFO => [ { USER_NAME => "name", USER_IP => 'xxxxxx' }
              ]);
print $table->output();

Сам шаблон:

<table width=100% border=1>
     <tr><td colspan=3><h3>Заголовок:</h3></td></tr>
    <TMPL_LOOP NAME=USER_INFO>
    <tr>
        <td><TMPL_VAR NAME=USER_NAME></td>
        <td><TMPL_VAR NAME=USER_IP></td>
        <td><TMPL_VAR NAME=USER_MAC></td>
        </tr>
    </TMPL_LOOP>
</table>

Я беру информцию из базы, как ее подставить в param, т.е. если у меня 10 записей, то цикл должен выполниться 10 раз. Документацию по модулю читал, там решения не нашел, подскажите пожалуйста, я чего-то никак не вразумлю..

Вы уже сделали

Вы уже сделали бОльшую часть работы.

Если честно, я не проверял как оно работает на HTML::Template, но формат передаваемых данных именно такой какой ему нужен.

Отличающийся кусок кода выглядит примерно так:

$table->param(USER_INFO => [
{ USER_NAME => "name1", USER_IP => 'xxxxxx' },
{ USER_NAME => "name2", USER_IP => 'xxxxxx' },
{ USER_NAME => "name3", USER_IP => 'xxxxxx' },
{ USER_NAME => "name4", USER_IP => 'xxxxxx' },
              ]);

чтобы "поштучно" добавлять переменные в этот массив (как их выдает DBI) делается примерно так:

$a = [
{ USER_NAME => "name1", USER_IP => 'xxxxxx' },
];
push @$a,{ USER_NAME => "name2", USER_IP => 'xxxxxx' };
$table->param(USER_INFO => $a);

или так (вначале делаем пустой массив, потом в цикле добавляем в него значения):

$a = [
];
push @$a,{ USER_NAME => "name2", USER_IP => 'xxxxxx' };
...
push @$a,{ USER_NAME => "name3", USER_IP => 'xxxxxx' };
$table->param(USER_INFO => $a);

примеры тут:
http://search.cpan.org/~samtregar/HTML-Template-2.9/Template.pm#TMPL_LOO...

Спасибо

Спасибо огромное за разъяснения. Я немного не понял ваш синтаксис, что значит $a = []; (т.е. к чему тут квадратные скобки) и что такое @$a - ? :)

сделал так:

SQL запрос

my $query_get_users = $db->prepare("SELECT name, ip, mac FROM users");
$query_get_users->execute();

Выгребаем данные, и складываем в массив

my @users_data = ();
while ( my @data = $query_get_users->fetchrow_array() )
{
    push @users_data, { USER_NAME => $data[0], USER_IP => $data[1], USER_MAC => $data[2] };
}

Обьявляем шаблон, отправляем данные и выводим таблицу:

my $table = HTML::Template->new(filename => './templates/table.htm');
$table->param(USER_INFO => \@users_data);
print $table->output();

use Source();

Более кошерный

Более кошерный вариант:

my $data = $db->selectall_arrayref("SELECT name, ip, mac FROM users", { Slice => {} });
my $table = HTML::Template->new(filename => './templates/table.htm');
$table->param(USER_INFO => $data);
print "Content-type: text/html\n\n";
print $table->output();

selectall_arrayref вернет результат в виде указателя на массив, Slice => приведет к тому, что в качестве элементов будут использоваться указатели на хеш с ключами по названиям полей.
Аккуратнее, места занимает меньше, работает быстрее.

Я немного не

Quote:
Я немного не понял ваш синтаксис, что значит $a = []; (т.е. к чему тут квадратные скобки) и что такое @$a - ? :)

Это работа с указателями. $a приравнивается указатель на анонимный массив, @$a - взять массив по указателю.
Вообще читайте книги про Perl.

Угу

Я бы сказал не приравнивается, а присваивается, и не взять массив, а разименовать его... Хотя какая разница, как это звучит по-русски, если на Perl оно гораздо короче пишется :) ?

Да, конечно,

Да, конечно, присваивается и разъименовывается, просто попытался написать максимально простым языком (как Perl :)

И на Perl оно не только короче пишется, но и читается глазом очень ясно - как говорят дизайнеры, "глазу есть за что зацепиться".