Mojolicious和Passwd :: Unix

时间:2013-06-30 17:00:22

标签: perl unix mojolicious passwd mojolicious-lite

我正在尝试在这个perl脚本上返回Unix用户列表。我正在使用带有Passwd :: Unix的Mojolicious框架。

参考文献:

这是我的代码:

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:5)

基于Jason Gray的评论,您可能会提供一个提供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::TemplateTagHelpers形式,我知道并不适合所有人。