gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:23:21 26 4
gpt4 key购买 nike

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

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

最佳答案

您正在寻找:

DEBUG_UNDEF

This option causes the Template Toolkit to throw an 'undef' error whenever it encounters an undefined variable value.


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这是一个普通实例并将其输出打印到 STDOUT和默认值一样。

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

    我在这方面的一些想法:
  • 如果 Template::Toolkit 就好了用过 Carp这样我们就可以获得更多关于警告的背景信息。
  • 人们可能可以从模板派生出一个类 warn而不是 die错误。我不想那样做。
  • 根据模板的设置方式,一次一行提供它可能是有意义的,以便在找到未定义的值时可以发出行号。
  • 应该可以更改模板以测试它们自己的错误并在面对未定义的值时发出更合理的文本。
  • 关于perl - Perl 的模板工具包可以警告未定义的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/571898/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com