2

次の構文を使用して関数を挿入してText::Templateいるため、使用時にその関数について認識しますfill_in()

*Text::Template::GEN0::some_function = *SomeLibrary::some_function;

fill_in()が複数回呼び出されると、後続の呼び出しで GEN0 が GEN1 に変更され、次に GEN2 に変更されることに気付きました。

fill_inGEN0 名前空間のみが使用されるため、これは が 1 回呼び出された場合にのみ機能します。

使用されている各名前空間に 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 に答える