我使用以下语法将函数注入Text::Template
,以便在使用fill_in()
时知道该函数:
*Text::Template::GEN0::some_function = *SomeLibrary::some_function;
我注意到如果多次调用fill_in()
,那么GEN0会在后续调用中更改为GEN1,然后是GEN2 ...等。
所以只有在调用fill_in
一次时才有效,因为只使用了GEN0命名空间。
如何动态地将some_function注入每个使用过的命名空间?我知道它是这样的,但我不知道我会使用的语法:
my $i = 0;
foreach my $item (@$items) {
# *Text::Template::GEN{i}::some_function = *SomeLibrary::some_function;
$i++;
# Call fill_in here
}
答案 0 :(得分:4)
无需猜测内部。使用PREPEND选项:
use strict;
use warnings;
use Text::Template;
sub MyStuff::foo { 'foo is not bar' };
my $tpl = Text::Template->new(
TYPE => 'STRING',
SOURCE => "{ foo() }\n",
PREPEND => '*foo = \&MyStuff::foo',
);
print $tpl->fill_in;
结果:
% perl tt.pl
foo is not bar
答案 1 :(得分:3)
这应该有效:
my $i = 0;
foreach my $item (@$items) {
my $str = "Text::Template::GEN${i}::some_function";
no strict "refs";
*$str = *SomeLibrary::some_function;
*$str if 0; # To silence warnings
use strict "refs"
$i++;
# Call fill_in here
}