2009-02-21 5 views

Respuesta

9

Sí. Si pasa la opción DEPURAR al Template->new, TT le advertirá acerca de los valores indefinidos.

Consulte los documentos aquí: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod

+0

Lo vi, pero no estaba seguro de si arrojaría un montón de otras cosas también. – cdleary

+0

Además, ¿hay alguna manera de hacer que vaya a un manejador de archivo particular? – cdleary

+1

No sé, lo siento :) Uso Template :: Refine. – jrockway

16

Usted está buscando:

DEBUG_UNDEF 

Esta opción hace que el Template Toolkit para lanzar un error 'no def' siempre que encuentre un valor de variable no definida.

use Template::Constants qw(:debug); 

my $template = Template->new({ 
    DEBUG => DEBUG_UNDEF, 
}); 

(De http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Config.pod.)

Si desea hacer algún tratamiento especial de la excepción, tendrá que to catch it or replace the __DIE__ signal handler.


Digámoslo juntos:

#!/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); 

la salida es:

undef error - nothing is undefined 
First something undefined: . 
And now something defined: 42. 

Mi enfoque era utilizar dos instancias diferentes de la clase de plantilla:

  1. $debug_tt que tiene el indicador DEBUG_UNDEF se activó y oculta su salida en la variable $output.

  2. $tt que es una instancia de vanilla e imprime su salida a STDOUT como es el valor predeterminado.

Ambas instancias usan la misma plantilla almacenada en $template y el mismo hash variable almacenada en $vars. $debug_tt está envuelto en un eval para evitar salir prematuramente y se emite una advertencia si $debug_tt->error() es verdadero. $tt se ejecuta normalmente. Creo que esto satisface tus principales requisitos aunque probablemente no sea eficiente. Necesitamos analizar $template dos veces usando este método.

Algunos pensamientos que había que trabajan en este:

  1. Hubiera sido agradable si habían usado Template::ToolkitCarp para que pudiéramos conseguir un poco más de contexto en la advertencia.

  2. Uno probablemente podría derivar una clase de la plantilla que warn en lugar de die en el error. No tenía ganas de hacer eso.

  3. Dependiendo de cómo estén configuradas sus plantillas, podría tener sentido alimentarlo en una línea a la vez para que pueda emitir números de línea cuando se encuentre un valor indefinido.

  4. Debería ser posible modificar las plantillas para probar sus propios errores y emitir texto más sensible frente a valores indefinidos.

+1

¿Hay alguna forma de que * advierta * en todos los valores indefinidos, pero aún así haga que la plantilla finalice? – cdleary

+0

Mierda, me perdí la fecha límite ... lo siento Jon, pero gracias por la ayuda! – cdleary

Cuestiones relacionadas