2009-02-21 9 views

risposta

16

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:

  1. $debug_tt che ha il flag DEBUG_UNDEF è attivo e nasconde l'output nella variabile $output.

  2. $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:

  1. Sarebbe stato bello se avevano usato Template::ToolkitCarp in modo che abbiamo potuto ottenere un po 'più di contesto sul sistema di allarme.

  2. Si potrebbe probabilmente derivare una classe da Modello che avrebbeinvece di die in caso di errore. Non mi sentivo di farlo.

  3. 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.

  4. Dovrebbe essere possibile modificare i modelli per verificare i propri errori ed emettere testo più sensibile di fronte a valori indefiniti.

+1

C'è un modo per farlo * warn * su tutti i valori non definiti, ma rendere ancora il modello al completamento? – cdleary

+0

Crap, ho perso la scadenza ... scusa Jon, ma grazie per l'aiuto! – cdleary

Problemi correlati