【问题标题】:Mojolicious and Passwd::UnixMojolicious 和 Passwd::Unix
【发布时间】:2013-06-27 21:09:21
【问题描述】:

我试图在这个 perl 脚本上返回 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>

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

【问题讨论】:

  • 尝试省略 my $users = $pu-&gt;users; 并将循环替换为 foreach my $user ($pu-&gt;users) {
  • @JasonGray,不工作,这不是一个很好的解决方案,但无论如何谢谢。 :)

标签: perl unix mojolicious passwd mojolicious-lite


【解决方案1】:

$pu-&gt;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>

【讨论】:

    【解决方案2】:

    根据 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 表单的忠实粉丝,我知道它并不适合所有人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多