Может ли Perl Template Toolkit предупреждать о значениях undefined?

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

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

Ответы

Ответ 2

Вы ищете:

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 значениями.