Mojolicious和Passwd :: Unix

Cai*_*ifa 3 unix perl passwd mojolicious 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>
Run Code Online (Sandbox Code Playgroud)

但它不是返回用户,而是仅打印用户总数.

测试文件

fri*_*edo 6

$pu->users返回所有用户的数组.将该返回值分配给标量时

my $users = $pu->users;
Run Code Online (Sandbox Code Playgroud)

您将数组放在标量上下文中,该上下文返回数组的大小.

相反,将结果分配给数组,并在存储中放置对该数组的引用:

my @users = $pu->users;
$self->stash( users => \@users );
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用匿名数组引用,如下所示:

$self->stash( users => [ $pu->users ] );
Run Code Online (Sandbox Code Playgroud)

在您的模板中,您必须取消引用数组以循环它:

__DATA__

@@ test.html.ep
<ul>
  <% foreach my $user (@$users) { %>
  <li><%= $user %></li>
  <% } %>
</ul>
Run Code Online (Sandbox Code Playgroud)


Joe*_*ger 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>
Run Code Online (Sandbox Code Playgroud)

实际上,您可以制作一个返回所有用户的助手:

#!/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>
Run Code Online (Sandbox Code Playgroud)

另外:我辩论了使用TagHelpers表单作为模板,但决定不使问题复杂化。就是说,如果您这样选择,则可以按照以下方法来做模板:

@@ test.html.ep

%= tag ul => begin
  % foreach my $user (users) {
    %= tag li => $user
  % }
% end
Run Code Online (Sandbox Code Playgroud)

但是话又说回来,我个人是Mojo :: TemplateTagHelpers表单的忠实拥护者,我知道它并不适合所有人。