有没有办法让Perl的Template
显示所有未定义的值的警告,我试图在Template::process
期间使用GET
directive(通过[% %]
)?Perl的模板工具包能否对未定义的值发出警告?
默认行为是忽略并继续前进。如果可能,我想在未定义值的情况下仅警告,并将消息记录到STDERR。
有没有办法让Perl的Template
显示所有未定义的值的警告,我试图在Template::process
期间使用GET
directive(通过[% %]
)?Perl的模板工具包能否对未定义的值发出警告?
默认行为是忽略并继续前进。如果可能,我想在未定义值的情况下仅警告,并将消息记录到STDERR。
是的。如果您将DEBUG选项传递给Template->new
,TT会警告您未定义的值。
在这里看到的文档:http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod
您正在寻找:
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.
我的方法是使用模板类的两个不同的实例:
$debug_tt
哪有DEBUG_UNDEF
标志打开并将其输出隐藏在$output
变量中。
$tt
这是一个香草实例并将其输出打印到STDOUT
,因为它是默认值。
两个实例使用存储在$template
相同的模板,并存储在$vars
相同的变量的散列。 $debug_tt
包装在eval
中以避免过早退出,并且如果$debug_tt->error()
为真,则发出警告。 $tt
正常执行。我认为这符合您的主要要求,但可能效率不高。我们需要使用这种方法解析$template
两次。
的几点思考我对这个工作:
这本来是很好,如果Template::Toolkit
曾使用Carp
这样我们就可以得到警告更多的上下文。
人们可能会从模板中派生出一个类,它会在出现错误时将warn
而不是die
。我不想那样做。
根据您的模板设置方式,一次只能在一行中输入它是有意义的,这样您可以在找到未定义的值时发出行号。
应该可以更改模板来测试自己的错误,并在面对未定义的值时发出更明智的文本。
看到了,但不确定是否会喷出一堆其他的东西。 – cdleary 2009-02-21 02:14:23
另外,有没有办法让它去到一个特定的文件句柄? – cdleary 2009-02-21 02:17:41