当前位置:  开发笔记 > 编程语言 > 正文

Perl的模板工具包可以警告未定义的值吗?

如何解决《Perl的模板工具包可以警告未定义的值吗?》经验,为你挑选了2个好方法。

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

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



1> Jon Ericson..:

您正在寻找:

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出错.我不喜欢那样做.

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

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



2> jrockway..:

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

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

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有