2013-06-30 57 views
3

我想返回這個perl腳本上的Unix用戶列表。我用Passwd :: Unix使用Mojolicious框架。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

Building賈森灰色的評論,你可以做一個助手,提供了P ::ü實例,然後調用從模板,像這樣:

#!/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::TemplateTagHelpers形式的大風扇就個人而言,我知道它並不適合所有人。

+0

+1 - 以前不知道TagHelpers。 – friedo

6

$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 –