2009-02-21 47 views

回答

16

您正在寻找:

DEBUG_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. 

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

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

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

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

的几点思考我对这个工作:

  1. 这本来是很好,如果Template::Toolkit曾使用Carp这样我们就可以得到警告更多的上下文。

  2. 人们可能会从模板中派生出一个类,它会在出现错误时将warn而不是die。我不想那样做。

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

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

相关问题