没有插件可以做到这一点,但您可以编写自己的函数并将其传递到信息哈希中,就像这样
use strict;
use warnings 'all';
use Time::Seconds;
use Template;
my $vars = {
format_hms => \&format_hms,
};
my $tt = Template->new;
$tt->process(\<<END_TEMPLATE, $vars);
[% SET tseconds = 478966 %]
[% format_hms(tseconds) %]
END_TEMPLATE
sub format_hms {
my $t = Time::Seconds->new(shift);
my $h = int $t->hours;
$t -= $h * ONE_HOUR;
my $m = int $t->minutes;
$t -= $m * ONE_MINUTE;
my $s = int $t->seconds;
sprintf "%d:%02d:%02d\n", $h, $m, $s;
}
输出
133:02:46
更新
如果您希望通过自定义插件而不是通过在 %vars 哈希中传递子例程引用来使代码可用,这里有一个简单的模块可以让您这样做
package Custom::Template::Plugin::Duration;
use strict;
use warnings 'all';
use base 'Template::Plugin';
use Time::Seconds;
sub format_hms {
my $self = shift;
my $t = Time::Seconds->new($_[0]);
my $h = int $t->hours;
$t -= $h * ONE_HOUR;
my $m = int $t->minutes;
$t -= $m * ONE_MINUTE;
my $s = int $t->seconds;
sprintf "%d:%02d:%02d\n", $h, $m, $s;
}
1;
如果您将其另存为Custom/Template/Plugin/Duration.pm 在@INC 目录之一(当前工作目录是一个不错的选择),那么您可以编写这样的代码
use strict;
use warnings 'all';
use Template;
my $tt = Template->new(
PLUGINS => {
duration => 'Custom::Template::Plugin::Duration',
}
);
$tt->process(\<<END_TEMPLATE);
[% USE duration %]
[% SET tseconds = 478966 %]
[% tseconds %] is equivalent to
[% duration.format_hms(tseconds) %]
END_TEMPLATE
输出
478966 is equivalent to
133:02:46
然而,除了模板访问子例程的方式之外,这里并没有什么本质上的不同。底层代码相同