Mojolicious and Passwd::Unix

Я пытаюсь вернуть список пользователей Unix по этому сценарию perl. Я использую Mojolicious фреймворк с 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>
Другие вопросы по тегам