-3

<% TPL name=userName %>変数(like )と関数(like<% TPL func=time param=now %>または)の2種類のマクロを使用して単純なテンプレートシステムを作成する必要があります<% TPL func=rand %>

すべてOKですが、テンプレートのコンパイルを追加する必要があります。<% TPL name=userName %>変数マクロをPerl変数( to$userNameまたは$vars->{userName})および関数to"Some text $rand->() blah blah"またはに置き換えたい"Some text $func->{time}->('now') and blah blah blah"

私は変数のためにそれを作りました:

my $tpl = eval 'sub { my $vars = shift; "Hello, $vars-{userName}!" }';
return $tpl->({ userName => 'John' });

しかし、関数に対してそれを行う方法がわかりません。このコードは機能しません:

my $tpl = eval 'sub { my $func = shift; "Today is $func->{time}->('day')" }';
return $tpl->({ time => \&_time });

関数を機能させるにはどうすればよいですか?

PS別のテンプレートシステム(TT、HTML :: Templateなど)は必要ありません

4

1 に答える 1

1

重要な部分は

"Today is $func->{time}->('day')"

文字列内から関数を呼び出すことはできず、coderefを補間することもできないため、これは機能しません。次のソリューションから選択できます。

"Today is " . $func->{time}->('day');

"Today is @{[$func->{time}->('day')]}";

my $today = $func->{time}->('day');
"Today is $today";

eval匿名のサブまたはクロージャーの代わりに使用するため、コードはとにかく病気です!あなたはただ書くことができます

my $tpl = sub {
   my ($vars) = @_;
   return "Hello, $vars->{userName}!";
};
return $tpl->({ userName => 'John' });

my $tpl = sub {
   my ($func) = @_;
   return "Today is $func->{time}->('day')";
};
return $tpl->({ time => \&_time });

ヒント:このようなテンプレートシステムを構築する場合、この/eオプションは非常に役立ちます。

$template =~ s{<% func=(\w+) param=(\w+) %>}{join(' ',$hash->{$1}->($2))}e;
于 2012-08-03T20:00:23.710 に答える