2013-06-30 4 views
3

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

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

Test file

+0

Попробуйте отключить 'my $ users = $ pu-> users;' и замените ваш цикл 'foreach my $ user ($ pu-> users) {' – hwnd

+0

@JasonGray, не работайте, и это не довольно решение, но спасибо в любом случае. :) –

ответ

4

Строительство на комментарий Джейсон Грей, вы могли бы сделать помощник, который обеспечивает 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 лично, я знаю, его не для всех.

+0

+1 - раньше не знал о TagHelpers. – friedo

6

$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> 
+0

Эй, @friedo, отлично работает, спасибо! : D –