3

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

参考:

那是我的代码:

测试.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>

但它不是返回用户,而是只打印用户总数。

测试文件

4

2 回答 2

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>
于 2013-06-30T17:28:50.490 回答
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表单的忠实粉丝,我知道它并不适合所有人。

于 2013-07-01T02:02:53.720 回答