2017-01-18 208 views
2

这个问题是关于从模板::工具包(Perl)宏的使用如何包含模板::工具包 - 宏?

我没有写宏,并把它们放入一个单独的文件,以在其他几个模板文件中使用它们。

我的宏都位于一个单独的命名macros.tt模板文件:

----- file macros.tt ------ 
[% MACRO decorateStatus(status) BLOCK -%] 
    [% ico = 'status_unknown' -%] 
    [% IF status == "New" -%][% ico = 'status_waiting' -%] 
    [% ELSIF status == "Working" -%][% ico = 'status_work' -%] 
    [% ELSIF status == "Deleted" -%][% ico = 'status_deleted' -%] 
    [% END -%] 
    [% status %] <img src="[% c.uri_for('/images/ico/' _ ico _ '.png') %]" text="[% status %]"> 
[% END-%] 

现在我试图用另一个模板中的这个宏 - 但这种失败作为宏未展开:

----- file demo.tt ------- 
[% INCLUDE macros.tt %] 
…. 
[% status = ‘New’ %] 
<td>[% decorateStatus(status) %]</td> 
…. 

将宏直接放到我想使用它的文件中,一切都按预期工作。

什么是包含来自不同文件的宏的“正确”方式?

回答

5

使用INCLUDE,所有的变量定义(和一个宏实际上只是一个奇特的变量)被本地化为包含的文件。这意味着宏定义在包含文件之外是不可见的。

要使宏在调用文件中可见,您需要PROCESS而不是INCLUDE。作为the documentation says

PROCESS指令类似于INCLUDE但在处理模板之前不进行任何 本地化的变量。对包含模板中的变量所做的任何更改 都将在 (包括模板)中可见。

+0

谢谢 - 你是我的英雄!应该仔细阅读文件;-) – hoppfrosch

+2

我可以推荐一本[好书](http://shop.oreilly.com/product/9780596004767.do):-) –

1

如果使用的是与它们之间共享宏超过1个模板文件,试试这个:

更容易和更清洁的不是包括[% PROCESS 'macros.tt' %]在每个模板是让TT处理您的宏文件,PRE_PROCESS每次调用之前。

use Template; 

my $tt = Template->new({ 
    INCLUDE_PATH => '/usr/local/templates', 
    PRE_PROCESS => 'macros.tt', 
})