有沒有辦法讓Perl的Template
顯示所有未定義的值的警告,我試圖在Template::process
期間使用GET
directive(通過[% %]
)?Perl的模板工具包能否對未定義的值發出警告?
默認行爲是忽略並繼續前進。如果可能,我想在未定義值的情況下僅警告,並將消息記錄到STDERR。
有沒有辦法讓Perl的Template
顯示所有未定義的值的警告,我試圖在Template::process
期間使用GET
directive(通過[% %]
)?Perl的模板工具包能否對未定義的值發出警告?
默認行爲是忽略並繼續前進。如果可能,我想在未定義值的情況下僅警告,並將消息記錄到STDERR。
是的。如果您將DEBUG選項傳遞給Template->new
,TT會警告您未定義的值。
在這裏看到的文檔:http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod
您正在尋找:
DEBUG_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)
如果你想要做的異常的一些特殊的處理,你需要to catch it or replace the __DIE__
signal handler。
讓我們把它一起:
#!/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.
我的方法是使用模板類的兩個不同的實例:
$debug_tt
哪有DEBUG_UNDEF
標誌打開並將其輸出隱藏在$output
變量中。
$tt
這是一個香草實例並將其輸出打印到STDOUT
,因爲它是默認值。
兩個實例使用存儲在$template
相同的模板,並存儲在$vars
相同的變量的散列。 $debug_tt
包裝在eval
中以避免過早退出,並且如果$debug_tt->error()
爲真,則發出警告。 $tt
正常執行。我認爲這符合您的主要要求,但可能效率不高。我們需要使用這種方法解析$template
兩次。
的幾點思考我對這個工作:
這本來是很好,如果Template::Toolkit
曾使用Carp
這樣我們就可以得到警告更多的上下文。
人們可能會從模板中派生出一個類,它會在出現錯誤時將warn
而不是die
。我不想那樣做。
根據您的模板設置方式,一次只能在一行中輸入它是有意義的,這樣您可以在找到未定義的值時發出行號。
應該可以更改模板來測試自己的錯誤,並在面對未定義的值時發出更明智的文本。
看到了,但不確定是否會噴出一堆其他的東西。 – cdleary 2009-02-21 02:14:23
另外,有沒有辦法讓它去到一個特定的文件句柄? – cdleary 2009-02-21 02:17:41