动态函数注入Text :: Template命名空间

时间:2014-12-10 22:20:31

标签: perl texttemplate

我使用以下语法将函数注入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
}

2 个答案:

答案 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
}