【问题标题】:How can you pass undef as an argument to an object method from a TT template?如何将 undef 作为参数从 TT 模板传递给对象方法?
【发布时间】:2010-12-12 15:48:48
【问题描述】:

Template-Toolkit 似乎总是想将 undef 插入空字符串。所以像这样的模板:

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 而不是空字符串?

【问题讨论】:

  • 是否需要区分空字符串和undef的情况,还是直接将空字符串转换成undef就可以了?
  • 是的,这就是重点——我需要保留 undef undef,而不是让 TT 将其更改为空字符串。 IE。 perl 方法需要能够检查参数是否已定义。

标签: perl template-toolkit


【解决方案1】:

使用[% PERL %]怎么样?

[% PERL %]
[% my_perl_code %]
[% END %]

【讨论】:

  • 啊,是的,这应该可行 - 谢谢!但是 - 你知道如何在 EVAL_PERL 代码中引用模板变量吗?例如。如何使用'some_object',这不起作用,“全局符号“$some_object”需要明确的包名”:[% PERL %] $some_object->some_method (1, undef, 2); [% END %]
  • 此答案应提供有关如何打开此功能的信息。
  • 好点;创建模板对象时需要使用 EVAL_PERL: my $tt = Template->new ({EVAL_PERL => 1}); template-toolkit.org/docs/modules/Template.html#method_newtemplate-toolkit.org/docs/modules/…
  • @F5: re using template var with EVAL_PERL: U should be able to do this: [% PERL %]$stash->get( 'some_object' )->some_method(1, undef, 2 );[% END %]
【解决方案2】:

这是Template Toolkit 的设计决策。来自Perl Template Toolkit "Badger book"的第50页:

如果模板工具包遇到没有定义值的变量,它不会抱怨。相反,它会悄悄地使用一个空字符串(即什么都没有)作为变量的值,并继续处理模板的提醒。

但是,您可以使用 DEBUG 选项让 TT 在看到 undef 时提供警告。有关详细信息,请参阅 SO 问题 Can Perl’s Template Toolkit warn on undefined values?

/I3az/

【讨论】:

  • OK - 所以似乎没有办法关闭它; [% PERL %] 解决方案似乎是要走的路。
【解决方案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;

注意。上一行中的 $stash 由 TT 提供,是对顶级 stash 对象的引用。

/I3az/

【讨论】:

  • 尽管使用 TT 多年,但我以前也没有遇到过!但是后来我设法避免使用 EVAL_PERL,因此永远不需要知道 ;-) 这是我找到它的地方:template-toolkit.org/docs/manual/Directives.html#section_PERL
  • 虽然这是解决上述问题的一种方法,但它要好得多以避免在模板中包含 PERL 块,并在 Perl 调用中找到解决问题的方法TT 代替。
  • @castaway:完全同意。但我认为这个答案不值得一票否决:(
猜你喜欢
  • 2019-03-11
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多