【问题标题】:Can Perl's Template Toolkit warn on undefined values?Perl 的模板工具包可以警告未定义的值吗?
【发布时间】:2010-10-08 23:38:08
【问题描述】:

有没有办法让 Perl 的 TemplateTemplate::process 期间尝试在(通过 [% %])上使用 GET directive 的所有未定义值显示警告?

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

【问题讨论】:

    标签: perl templates warnings template-toolkit


    【解决方案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 类的两个不同实例:

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

    2. $tt 是一个 vanilla 实例,默认情况下会将其输出打印到 STDOUT

    两个实例都使用存储在$template 中的相同模板和存储在$vars 中的相同变量散列。 $debug_tt 被包裹在 eval 中以避免过早退出,如果 $debug_tt-&gt;error() 为真,则会发出警告。 $tt 正常执行。我认为这可以满足您的主要要求,尽管它可能效率不高。我们需要使用这种方法解析两次$template

    我在这方面的一些想法:

    1. 如果Template::Toolkit 使用了Carp 那就太好了,这样我们就可以获得更多关于警告的上下文。

    2. 可能会从 Template 派生一个类,该类在出错时将 warn 而不是 die。我不想那样做。

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

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

    【讨论】:

    • 有没有办法在所有未定义的值上警告,但仍然渲染模板完成?
    • 废话,我错过了最后期限......对不起乔恩,但感谢您的帮助!
    【解决方案2】:

    是的。如果您将 DEBUG 选项传递给 Template-&gt;new,TT 将警告您未定义的值。

    在此处查看文档:http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod

    【讨论】:

    • 看到了,但不确定它是否还会喷出一堆其他东西。
    • 另外,有没有办法让它转到特定的文件句柄?
    • 不知道,抱歉 :) 我使用的是 Template::Refine。
    猜你喜欢
    • 2021-05-24
    • 2012-12-23
    • 2014-01-08
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2023-03-12
    • 2019-05-29
    • 2020-12-11
    相关资源
    最近更新 更多