Perl的模板工具包可以警告未定义的值吗?

时间:2009-02-21 01:37:39

标签: perl templates warnings template-toolkit

有没有办法在Template期间为我尝试使用GET directive(通过[% %])的所有未定义值制作Perl的Template::process显示警告?

默认行为是忽略并继续前进。如果可能的话,我想在未定义值的情况下警告 ,并将消息记录到STDERR。

2 个答案:

答案 0 :(得分:16)

您正在寻找:

DEBUG_UNDEF
  

此选项会导致Template Toolkit在遇到未定义的变量值时抛出“undef”错误。

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_UNDEF,
});

(来自http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Config.pod。)

如果您想对异常进行一些特殊处理,则需要to catch it or replace the __DIE__ signal handler


让我们把它放在一起:

#!/usr/bin/perl

use strict;
use warnings;

use Template;
use Template::Constants qw( :debug );

my $debug_tt = Template->new({
   DEBUG => DEBUG_UNDEF,
});

my $tt = Template->new();

my $vars = {
    something => "42",
};

my $template = <<EOF;
First something undefined: [% nothing %].
And now something defined: [% something %].
EOF

my $output = '';

eval {$debug_tt->process(\$template, $vars, \$output)};
warn $debug_tt->error() if $debug_tt->error();

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

输出结果为:

undef error - nothing is undefined
First something undefined: .
And now something defined: 42.

我的方法是使用Template类的两个不同实例:

  1. $debug_tt已打开DEBUG_UNDEF标记并将其输出隐藏在$output变量中。

  2. $tt这是一个vanilla实例,并将其输出打印到STDOUT,这是默认设置。

  3. 两个实例都使用$template中存储的相同模板和$vars中存储的相同变量哈希。 $debug_tt包含eval以避免过早退出,如果$debug_tt->error()为真,则会发出警告。 $tt正常执行。我认为这可以满足您的主要要求,尽管它可能效率不高。我们需要使用此方法解析$template两次。

    我曾经对此做过一些想法:

    1. 如果Template::Toolkit使用了Carp,那就太好了,这样我们就可以在警告上获得更多的背景信息。

    2. 有人可能会从模板派生一个类warn而不是die出错。我不喜欢那样做。

    3. 根据模板的设置方式,一次一行输入可能是有意义的,这样当找到未定义的值时就可以发出行号。

    4. 应该可以更改模板以测试自己的错误,并在面对未定义的值时发出更明智的文本。

答案 1 :(得分:9)

是。如果您将DEBUG选项传递给Template->new,TT会警告您未定义的值。

请参阅此处的文档:http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod