15

の間に (経由で)ディレクティブTemplateを使用しようとするすべての未定義の値に対してPerl の警告を表示する方法はありますか?GET[% %]Template::process

デフォルトの動作は、無視して先に進むことです。可能であれば、未定義の値の場合にのみ警告し、メッセージを STDERR に記録したいと思います。

4

2 に答える 2

17

あなたは探している:

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 つの異なるインスタンスを使用することでした。

  1. $debug_ttDEBUG_UNDEFフラグがオンになっており、その出力を変数$outputに隠しています。

  2. $ttこれはバニラ インスタンスであり、その出力をSTDOUTデフォルトのままに出力します。

どちらのインスタンスも、 に格納されている同じテンプレートと に格納され$templateている同じ変数ハッシュを使用し$varsます。 $debug_tt途中で終了するのを避けるために でラップされ、true の eval場合は警告が発行されます。正常に実行されます。おそらく効率的ではありませんが、これは主な要件を満たしていると思います。このメソッドを使用して 2 回解析する必要があります。$debug_tt->error()$tt$template

私がこれに取り組んでいたいくつかの考え:

  1. 警告についてもう少しコンテキストを取得できるようにTemplate::Toolkit使用していればよかったのに。Carp

  2. warnおそらく、エラーの代わりにTemplate からクラスを派生させることができdieます。私はそれをする気がしませんでした。

  3. テンプレートの設定方法によっては、未定義の値が見つかったときに行番号を発行できるように、一度に 1 行ずつフィードすることが理にかなっている場合があります。

  4. テンプレートを変更して独自のエラーをテストし、未定義の値に直面してより適切なテキストを出力できるようにする必要があります。

于 2009-02-25T21:25:47.133 に答える
9

はい。DEBUG オプションを に渡すとTemplate->new、TT は未定義の値について警告します。

ここのドキュメントを参照してください: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod

于 2009-02-21T01:56:37.380 に答える