の間に (経由で)ディレクティブ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_tt
DEBUG_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