Mojolicious and Passwd::Unix
Я пытаюсь вернуть список пользователей Unix по этому сценарию perl. Я использую Mojolicious фреймворк с Passwd::Unix.
Рекомендации:
- Mojolicious ( http://metacpan.org/pod/Mojolicious)
- Passwd:: Unix ( http://metacpan.org/pod/Passwd::Unix)
Это мой код:
test.pl
#!/usr/bin/env perl
use Mojolicious::Lite;
use Passwd::Unix;
# Instance
my $pu = Passwd::Unix->new();
get '/' => sub {
my $self = shift;
my $users = $pu->users;
$self->stash(
users => $users
);
} => 'test';
app->start;
__DATA__
@@ test.html.ep
<ul>
<% foreach my $user ($users) { %>
<li><%= $user %></li>
<% } %>
</ul>
Но вместо того, чтобы возвращать пользователей, он печатает только общее количество пользователей.
2 ответа
Основываясь на комментарии Джейсона Грея, вы можете создать помощника, который предоставляет экземпляр P::U, а затем вызвать его из шаблона, например, так:
#!/usr/bin/env perl
use Mojolicious::Lite;
use Passwd::Unix;
# Instance
helper pu => sub { state $pu = Passwd::Unix->new };
get '/' => 'test';
app->start;
__DATA__
@@ test.html.ep
<ul>
% foreach my $user (pu->users) {
<li><%= $user %></li>
% }
</ul>
Фактически, вы можете просто создать помощника, который возвращает всех пользователей:
#!/usr/bin/env perl
use Mojolicious::Lite;
use Passwd::Unix;
# Instance
helper users => sub { Passwd::Unix->new->users };
get '/' => 'test';
app->start;
__DATA__
@@ test.html.ep
<ul>
% foreach my $user (users) {
<li><%= $user %></li>
% }
</ul>
Кроме того: я обсуждал использование формы TagHelpers для шаблона, но решил не усложнять проблему. Тем не менее, вот как вы могли бы сделать шаблон, если вы так выбрали:
@@ test.html.ep
%= tag ul => begin
% foreach my $user (users) {
%= tag li => $user
% }
% end
Но опять же, я большой поклонник форм Mojo::Template и TagHelpers лично, я знаю, что это не для всех.
$pu->users
возвращает массив всех пользователей. Когда вы присваиваете это возвращаемое значение скаляру с
my $users = $pu->users;
Вы помещаете массив в скалярный контекст, который возвращает размер массива.
Вместо этого присвойте результаты массиву и поместите ссылку на этот массив в тайник:
my @users = $pu->users;
$self->stash( users => \@users );
Кроме того, вы можете использовать анонимную ссылку на массив, например:
$self->stash( users => [ $pu->users ] );
В вашем шаблоне вам нужно разыменовать массив, чтобы зациклить его:
__DATA__
@@ test.html.ep
<ul>
<% foreach my $user (@$users) { %>
<li><%= $user %></li>
<% } %>
</ul>