Ricercate:
DEBUG_UNDEF
questa opzione, il Template Toolkit di gettare un errore 'indefinito' ogni volta che incontra un valore variabile non definita.
use Template::Constants qw(:debug);
my $template = Template->new({
DEBUG => DEBUG_UNDEF,
});
(da http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Config.pod.)
Se si vuole fare un po 'speciale trattamento di eccezione, avrete bisogno di to catch it or replace the __DIE__
signal handler.
Mettiamola insieme:
#!/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);
l'output è:
undef error - nothing is undefined
First something undefined: .
And now something defined: 42.
Il mio approccio è stato quello di utilizzare due differenti istanze della classe Template:
$debug_tt
che ha il flag DEBUG_UNDEF
è attivo e nasconde l'output nella variabile $output
.
$tt
che è un'istanza di vaniglia e stampa l'output su STDOUT
come predefinito.
Entrambe le istanze utilizzano lo stesso template memorizzato nella $template
e lo stesso hash variabile memorizzata in $vars
. $debug_tt
viene inserito in un eval
per evitare l'uscita prematuramente e viene emesso un avviso se $debug_tt->error()
è true. $tt
viene eseguito normalmente. Penso che questo soddisfi le tue esigenze principali anche se probabilmente non è efficiente. Dobbiamo analizzare due volte lo $template
usando questo metodo.
Alcuni pensieri che avevo che lavorano su questo:
Sarebbe stato bello se avevano usato Template::Toolkit
Carp
in modo che abbiamo potuto ottenere un po 'più di contesto sul sistema di allarme.
Si potrebbe probabilmente derivare una classe da Modello che avrebbeinvece di die
in caso di errore. Non mi sentivo di farlo.
A seconda del modo in cui sono impostati i modelli, potrebbe essere opportuno inserirlo in una riga alla volta in modo da poter emettere i numeri di riga quando viene trovato un valore non definito.
Dovrebbe essere possibile modificare i modelli per verificare i propri errori ed emettere testo più sensibile di fronte a valori indefiniti.
fonte
2009-02-25 21:25:47
Visto che, ma non era sicuro se avrebbe vomitato un sacco di altre cose pure. – cdleary
Inoltre, c'è un modo per farlo andare ad un particolare handle di file? – cdleary
Bozza, mi dispiace :) Io uso Template :: Refine. – jrockway