15

有没有办法让 Perl对我尝试在 (via ) 期间使用指令Template的所有未定义值显示警告?GET[% %]Template::process

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

4

2 回答 2

17

您正在寻找:

DEBUG_UNDEF

此选项会导致模板工具包在遇到未定义的变量值时抛出“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。)

如果您想对异常进行一些特殊处理,则需要捕获它或替换__DIE__信号处理程序


让我们把它放在一起:

#!/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_ttDEBUG_UNDEF打开了标志并将其输出隐藏在$output变量中。

  2. $tt这是一个香草实例,并将其输出打印STDOUT为默认值。

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

我在这方面的一些想法:

  1. Template::Toolkit如果使用它会很好Carp,这样我们就可以获得更多关于警告的上下文。

  2. 人们可能会从 Template 派生一个类,warn而不是die出错。我不想那样做。

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

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

于 2009-02-25T21:25:47.133 回答
9

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

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

于 2009-02-21T01:56:37.380 回答