Ответ 1
Да. Если вы передадите опцию DEBUG на Template->new
, TT предупредит вас о значениях undefined.
Смотрите документы здесь: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod
Есть ли способ сделать предупреждения Perl Template
для всех значений undefined, которые я пытаюсь использовать директиву GET
(через [% %]
) во время Template::process
?
Поведение по умолчанию - игнорировать и двигаться дальше. Я бы хотел предупредить только в случае значений undefined, если это возможно, и для регистрации сообщений в STDERR.
Да. Если вы передадите опцию DEBUG на Template->new
, TT предупредит вас о значениях undefined.
Смотрите документы здесь: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod
Вы ищете:
DEBUG_UNDEF
Этот параметр заставляет Template Toolkit выдавать ошибку "undef" всякий раз, когда он встречает значение переменной undefined.
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 = <<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
, чтобы мы могли получить немного больше контекста для предупреждения.
Вероятно, можно получить класс из шаблона, который вместо die
был бы warn
при ошибке. Мне не хотелось этого делать.
В зависимости от того, как настроены ваши шаблоны, может возникнуть смысл кормить его в одну строку за раз, чтобы вы могли испускать номера строк, когда найдено значение undefined.
Необходимо изменить шаблоны, чтобы проверить свои собственные ошибки и исправить более разумный текст перед undefined значениями.