Mojolicious и 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>

Но вместо того, чтобы возвращать пользователей, он печатает только общее количество пользователей.

Тестовый файл


person Caio Tarifa    schedule 30.06.2013    source источник
comment
Попробуйте опустить my $users = $pu->users; и заменить цикл на foreach my $user ($pu->users) {   -  person hwnd    schedule 30.06.2013
comment
@JasonGray, не работает, и это не очень красивое решение, но все равно спасибо. :)   -  person Caio Tarifa    schedule 30.06.2013


Ответы (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 лично, я знаю, что это не для всех.

person Joel Berger    schedule 01.07.2013

$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>
person friedo    schedule 30.06.2013