3

この 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>

ただし、ユーザーを返す代わりに、ユーザーの総数のみを出力します。

テストファイル

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 に答える