有没有办法让Perl Template
显示所有未定义值的显示警告我试图在(via )期间使用该GET
指令?[% %]
Template::process
默认行为是忽略并继续前进.我想仅在未定义值的情况下发出警告(如果可能),并将消息记录到STDERR.
您正在寻找:
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.)
如果要对异常进行一些特殊处理,则需要捕获它或替换__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 = <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类的两个不同实例:
$debug_tt
其具有DEBUG_UNDEF
标志接通和隐藏其在输出$output
变量.
$tt
这是一个vanilla实例并将其输出打印STDOUT
为默认值.
两个实例都使用存储的相同模板$template
和存储的相同变量哈希$vars
. $debug_tt
被包裹在一起eval
以避免过早退出,如果$debug_tt->error()
是真的则发出警告. $tt
正常执行.我认为这可以满足您的主要要求,尽管它可能效率不高.我们需要解析$template
使用此方法两次.
我曾经对此做过一些想法:
如果Template::Toolkit
使用它会很好,Carp
这样我们就可以在警告上获得更多的上下文.
人们可能从Template中派生出一个类warn
而不是die
出错.我不喜欢那样做.
根据模板的设置方式,一次一行输入可能是有意义的,这样您就可以在找到未定义的值时发出行号.
应该可以更改模板以测试它们自己的错误,并在面对未定义的值时发出更明智的文本.
是.如果您将DEBUG选项传递给Template->new
,TT将警告您未定义的值.
请参阅此处的文档:http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod