Perl 的模板工具包可以警告未定义的值吗?
Posted
技术标签:
【中文标题】Perl 的模板工具包可以警告未定义的值吗?【英文标题】:Can Perl's Template Toolkit warn on undefined values? 【发布时间】:2010-10-08 23:38:08 【问题描述】:有没有办法让 Perl 的 Template
在 Template::process
期间尝试在(通过 [% %]
)上使用 GET
directive 的所有未定义值显示警告?
默认行为是忽略并继续。如果可能的话,我想仅在未定义值的情况下发出警告,并将消息记录到 STDERR。
【问题讨论】:
【参考方案1】:您正在寻找:
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。)
如果你想对异常做一些特殊处理,你需要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 类的两个不同实例:
$debug_tt
打开了DEBUG_UNDEF
标志并将其输出隐藏在$output
变量中。
$tt
是一个 vanilla 实例,默认情况下会将其输出打印到 STDOUT
。
两个实例都使用存储在$template
中的相同模板和存储在$vars
中的相同变量散列。 $debug_tt
被包裹在 eval
中以避免过早退出,如果 $debug_tt->error()
为真,则会发出警告。 $tt
正常执行。我认为这可以满足您的主要要求,尽管它可能效率不高。我们需要使用这种方法解析两次$template
。
我在这方面的一些想法:
如果Template::Toolkit
使用了Carp
那就太好了,这样我们就可以获得更多关于警告的上下文。
可能会从 Template 派生一个类,该类在出错时将 warn
而不是 die
。我不想那样做。
根据您的模板的设置方式,一次输入一行可能是有意义的,这样您就可以在找到未定义的值时发出行号。
应该可以更改模板以测试它们自己的错误并在面对未定义的值时发出更合理的文本。
【讨论】:
有没有办法在所有未定义的值上警告,但仍然渲染模板完成? 废话,我错过了最后期限......对不起乔恩,但感谢您的帮助!【参考方案2】:是的。如果您将 DEBUG 选项传递给 Template->new
,TT 将警告您未定义的值。
在此处查看文档:http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod
【讨论】:
看到了,但不确定它是否还会喷出一堆其他东西。 另外,有没有办法让它转到特定的文件句柄? 不知道,抱歉 :) 我使用的是 Template::Refine。以上是关于Perl 的模板工具包可以警告未定义的值吗?的主要内容,如果未能解决你的问题,请参考以下文章