我正在尝试在这个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>
但不是返回用户,而是只打印用户总数。
答案 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::Template和TagHelpers形式,我知道并不适合所有人。