Шаблонный Инструментарий Perl может предупредить о неопределенных значениях?

Различие заключается в том, что другие сборки, скомпилированные с кодом, который считывает свойство, скомпилированы против свойства.

Если позже вы решите, что вам нужно добавить код в getter или setter, вы можете сделать это, не вынуждая каждую связанную с ним сборку перекомпилировать.

Не так с полями. Если впоследствии вы измените поле как свойство, чтобы добавить этот код, другие сборки, связанные с вашим, перестанут функционировать должным образом, поскольку они скомпилированы для чтения поля, а не свойства.

Кроме того, много кода написано для поиска свойств, а не полей, таких как привязка данных и т. Д.

14
задан cdleary 21 February 2009 в 02:42
поделиться

2 ответа

Да. При передаче Параметра отладки Template->new TT предупредит Вас о неопределенных значениях.

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

9
ответ дан 1 December 2019 в 12:02
поделиться

Вы ищете:

DEBUG_UNDEF

Эта опция заставляет Шаблонный Инструментарий бросать 'undef' ошибку каждый раз, когда это встречается со значением неопределенной переменной.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_UNDEF,
});

(От [1 121] 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.

Мой подход должен был использовать два различных экземпляра Шаблонного класса:

  1. $debug_tt, который имеет DEBUG_UNDEF включенный флаг и скрывает его вывод в $output переменная.

  2. $tt, который является ванильным экземпляром и печатает его вывод к STDOUT, как значение по умолчанию.

Оба экземпляра используют тот же шаблон, сохраненный в [1 110] и тот же переменный хеш, сохраненный в [1 111]. $debug_tt обертывается в eval, чтобы не выходить преждевременно, и предупреждение испускается, если $debug_tt->error() верно. $tt обычно выполняется. Я думаю, что это удовлетворяет Ваши основные требования, хотя это, вероятно, не эффективно. Мы должны проанализировать $template дважды использование этого метода.

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

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

  2. можно было, вероятно, получить класс из Шаблона, который будет warn вместо [1 120] на ошибке. Я не испытывал желание делать это.

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

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

16
ответ дан 1 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: