の間に (経由で)ディレクティブTemplateを使用しようとするすべての未定義の値に対してPerl の警告を表示する方法はありますか?GET[% %]Template::process
デフォルトの動作は、無視して先に進むことです。可能であれば、未定義の値の場合にのみ警告し、メッセージを STDERR に記録したいと思います。
あなたは探している:
DEBUG_UNDEF
このオプションにより、テンプレート ツールキットは、未定義の変数値に遭遇するたびに「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 クラスの 2 つの異なるインスタンスを使用することでした。
$debug_ttDEBUG_UNDEFフラグがオンになっており、その出力を変数$outputに隠しています。
$ttこれはバニラ インスタンスであり、その出力をSTDOUTデフォルトのままに出力します。
どちらのインスタンスも、 に格納されている同じテンプレートと に格納され$templateている同じ変数ハッシュを使用し$varsます。  $debug_tt途中で終了するのを避けるために でラップされ、true の  eval場合は警告が発行されます。正常に実行されます。おそらく効率的ではありませんが、これは主な要件を満たしていると思います。このメソッドを使用して 2 回解析する必要があります。$debug_tt->error()$tt$template
私がこれに取り組んでいたいくつかの考え:
警告についてもう少しコンテキストを取得できるようにTemplate::Toolkit使用していればよかったのに。Carp
warnおそらく、エラーの代わりにTemplate からクラスを派生させることができdieます。私はそれをする気がしませんでした。
テンプレートの設定方法によっては、未定義の値が見つかったときに行番号を発行できるように、一度に 1 行ずつフィードすることが理にかなっている場合があります。
テンプレートを変更して独自のエラーをテストし、未定義の値に直面してより適切なテキストを出力できるようにする必要があります。
はい。DEBUG オプションを に渡すとTemplate->new、TT は未定義の値について警告します。
ここのドキュメントを参照してください: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod