Может ли Perl Template Toolkit предупреждать о неопределенных значениях? - PullRequest
14 голосов
/ 21 февраля 2009

Есть ли способ заставить Template Perl отображать предупреждения для всех неопределенных значений, которые я пытаюсь использовать директиву GET on (через [% %]) во время Template::process?

Поведение по умолчанию - игнорировать и двигаться дальше. Я хотел бы предупредить только в случае неопределенных значений, если это возможно, и регистрировать сообщения в STDERR.

Ответы [ 2 ]

16 голосов
/ 26 февраля 2009

Вы ищете:

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 = <<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->error() имеет значение true. $tt выполняется нормально. Я думаю, что это удовлетворяет вашим основным требованиям, хотя, вероятно, неэффективно. Нам нужно проанализировать $template дважды, используя этот метод.

Некоторые мысли, которые у меня были над этим:

  1. Было бы неплохо, если бы Template::Toolkit использовал Carp, чтобы мы могли получить немного больше контекста в предупреждении.

  2. Вероятно, можно получить класс из Template, который будет warn вместо die при ошибке. Я не хотел этого делать.

  3. В зависимости от того, как настроены ваши шаблоны, может иметь смысл подавать их по одной строке за раз, чтобы вы могли выдавать номера строк при обнаружении неопределенного значения.

  4. Должна быть возможность изменять шаблоны для проверки их собственных ошибок и создавать более осмысленный текст перед лицом неопределенных значений.

9 голосов
/ 21 февраля 2009

Да. Если вы передадите опцию DEBUG Template->new, TT предупредит вас о неопределенных значениях.

Смотрите документы здесь: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...