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)
但它不是返回用户,而是仅打印用户总数.

$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)
基于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 :: Template和TagHelpers表单的忠实拥护者,我知道它并不适合所有人。