2

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

2 回答 2

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
于 2014-12-11T15:32:01.973 回答
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
}
于 2014-12-10T23:45:49.357 回答