Skip to content

Text::Xslate::Manual::Debugging.ja

gardejo edited this page Nov 15, 2011 · 1 revision

Text::Xslate::Manual::Debugging.ja

Text::Xslate::Manual::Debuggingの日本語訳です。

Text::Xslateのバージョン1.5006から訳出しました。

名称

Text::Xslate::Manual::Debugging - Xslateテンプレートのデバッグ技法

説明

この文書はテンプレートをデバッグする技法について説明しています。

verbose => 2を設定する

まず最初にverbose => 2を試してみてください。 このオプションはすべての警告、特にundefに関係する警告を有効にします。

ファイル名と行番号

Xslateのメッセージは、ファイル名と、行番号と、可能であれば問題があると思われるソースコードの行番号を含んでいます。

また、Perlの文法【訳注:特殊リテラル】と同様に、テンプレートへ__FILE____LINE__というトークンを記すことでも、ファイル名と行番号を知ることができます。

登録した関数からファイル名や行番号を伝えられたい場合には、コールバック内でText::Xslate->current_fileText::Xslate->current_lineを呼び出すことで、テンプレート内で__FILE____LINE__を記した場合と、それぞれ同じ結果を得られます。

sub my_sqrt {
    my($n) = @_;

    if($n < 1) {
        # 警告の代わりにメッセージを返す
        return sprintf "!!! Can't take sqrt of $n at %s line %d !!!",
            Text::Xslate->current_file, Text::Xslate->current_line;
    }
    return sqrt($n);
}

my $tx = Text::Xslate->new(
    function => { sqrt => \&my_sqrt },
);

値のダンプ

functionのオプションによって、どんなダンプ用のモジュールも用いることができますが、Xslateはテンプレートで用いられる値をダンプするための組み込みのdumpフィルターを備えています。

<: $value | dump # Data::Dumperを使って$valueをダンプする :>

渡されていない変数、もしくは変数名の誤植の検知

Xslate自身は未定義値が使用されたときのための警告システムを備えていますが、それは往々にして十分なものではありません。

渡されていない変数を特定するために、何かの文字列、例えばFILL MEを埋め込みたいときには、hash_with_default()ユーティリティーを使うことができます。例えば:

use Text::Xslate::Util qw(hash_with_default);
$tx->render($name, hash_with_default(\%vars, sub { "FILL ME '@_' " }) );

これはタイされたハッシュへのラッパーであるので、とても遅いことに気を付けてください。

エラーメッセージのカスタマイズ

warn_handlerdie_handlerを使うことで、エラーハンドラーをカスタマイズすることができます。 これらのハンドラーでは、出力バッファーへカスタムメッセージを追加するためにText::Xslate->print()メソッドを呼び出すことができます。これにより、デバッグが容易になります。

#!perl -w
use strict;
use Text::Xslate;
my %vpath = (
    hello => 'Hello, <: $lang :> world!' . "\n",
);
my $tx = Text::Xslate->new(
    path         => \%vpath,
    verbose      => 2,
    warn_handler => sub { Text::Xslate->print('[[', @_, ']]') },
);

print $tx->render('hello', { });
# => Hello, [[use nil to print at ...]] world!

あわせて読みたい

Text::Xslate.ja

Text::Xslate::Manual.ja