2009-11-03 70 views
2

Template-Toolkit似乎總想將undef插入到空字符串中。所以這樣的一個模板:如何將undef作爲參數傳遞給TT模板中的對象方法?

Result is [% some_object.some_method (1, undef, 2) %] 

或本:

Result is [% ttvar %] 
      [% some_object.some_method (1, ttvar, 2) %] 

產生調用類似Perl:

some_object->some_method (1, '', 2) 

當我要的是:

some_object->some_method (1, undef, 2) 

有沒有辦法傳遞undef而不是空字符串?

+0

你需要空字符串和民主基金的情況加以區分,或者是確定只是轉換空字符串爲'undef'? – 2009-11-03 14:26:03

+0

是的,這就是整個觀點 - 我需要保持undef undef,而不是TT將它改爲空字符串。即perl方法需要能夠檢查參數是否被定義。 – 2009-11-03 14:33:10

回答

3

我添加了另一個答案,以顯示EVAL_PERL如何在TT的例子:

use Template; 
use DateTime; 

my $tt = Template->new(EVAL_PERL => 1); 

my $vars = { foo => 'DateTime', bar => DateTime->now, p => 'print' }; 

my $file = q{ 
    [% SET hello = 'Hello world' %] 
    [% PERL %] 
    print "[% hello %]\n"; 
    print [% foo %]->now, "\n"; 
    [% p %] $stash->get('bar')->ymd; 
    [% END %] 
}; 

$tt->process(\$file, $vars); 

以上輸出如下:

Hello world 
2009-11-03T15:31:50 
2009-11-03 

因爲TT充當預處理器併產生以下Perl代碼來解釋:

print "hello world\n"; 
print DateTime->now, "\n"; 
print $stash->get('bar')->ymd; 

注意。上面$存儲由TT提供,並且是對頂層存儲對象的引用。

/I3az/

+0

非常好,謝謝。不知道TT $ stash – 2009-11-03 15:52:34

+1

儘管在驢年使用TT,但我還沒有遇到過它!但後來我設法避免使用EVAL_PERL,因此從不需要知道;-)這裏是我找到它的地方:http://template-toolkit.org/docs/manual/Directives.html#section_PERL – draegtun 2009-11-03 22:33:49

+0

儘管這是一種方式爲了解決這個問題,爲了避免在你的模板中有PERL塊,並且找到一種方法來解決Perl調用TT中的問題,那麼它會更好。 – castaway 2011-05-13 13:56:53

3

如何使用[% PERL %]

[% PERL %] 
[% my_perl_code %] 
[% END %] 
+0

啊,是的,應該工作 - 謝謝!但 - 你知道如何引用EVAL_PERL代碼中的模板變量嗎?例如。如何使用'some_object',這是行不通的,「全局符號」$ some_object「需要明確的包名」: [%PERL%] $ some_object-> some_method(1,undef,2); [%END%] – 2009-11-03 14:47:38

+0

此答案應提供有關如何開啓此功能的信息。 – 2009-11-03 15:13:07

+0

好點;創建Template對象時需要使用EVAL_PERL: my $ tt = Template-> new({EVAL_PERL => 1}); http://template-toolkit.org/docs/modules/Template.html#method_new http://template-toolkit.org/docs/modules/Template.html#section_EVAL_PERL – 2009-11-03 15:18:29

2

這是一個設計決定Template Toolkit。從Perl Template Toolkit "Badger book"的第50頁開始:

如果模板工具包遇到沒有定義值的變量,則不會發出抱怨。相反,它將靜靜地使用一個空字符串(即完全沒有)用於變量的值,並繼續處理模板的提醒。

但是,您可以做的就是讓TT在使用DEBUG選項看到undef時提供警告。有關更多信息,請參閱SO問題Can Perl’s Template Toolkit warn on undefined values?

/I3az/

+0

行 - 所以看起來沒有辦法把它關掉; [%PERL%]解決方案似乎是要走的路。 – 2009-11-03 14:50:59

相關問題