No, el módulo no hace eso.
A la hora de la interpretación de la plantilla, HTML::Template va guardando en un
array todos los elementos de la plantilla. Cuando se encuentra con una TMPL_VAR que tiene un atributo DEFAULT, primero guarda el valor por defecto y luego el valor de la variable. Algo así:
Using text Syntax Highlighting
5 HTML::Template::DEFAULT=SCALAR(0x84a0dd8)
-> 'devil'
6 HTML::Template::VAR=SCALAR(0x8523d10)
-> 'valor puesto por param("WHO")'
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Pero no "almacena" el valor de por defecto, como si fuera el valor de la variable. Solo lo deja en la lista de elementos de la plantilla.
A la hora de sacarlo en pantalla o fichero, llamando con output(), recorre el
array, y al encontrarse con un objeto HTML::Template::DEFAULT, imprime su valor, salvo que el elemento siguiente tengo un valor definido (ver código de HTML::Template entre las líneas 2768 y 2785).
Una posible forma de hacerlo, es accediendo a ese
array interno y localizar el elemento HTML::Template::DEFAULT:
Using bash Syntax Highlighting
perl -MHTML::Template
-le '$tmpl = HTML::Template->new(filename=>"code_20732.html"); for (@{$tmpl->{parse_stack}}) { if (ref eq "HTML::Template::DEFAULT") { print $$_ }}'Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Pero, claro, este método no es estándar, es peligroso porque accedemos directamente a las estructuras internas del módulo, y por eso podría fallar en la siguiente versión del módulo.
Además, tampoco nos serviría si existiera más de una variable con valores por defecto.
En ningún momento, el valor de DEFAULT entra como valor de la variable, así que es inútil acceder a los valores puestos con param(). Si hacemos una prueba con
Using bash Syntax Highlighting
perl -MHTML::Template
-le '$tmpl = HTML::Template->new(filename=>"code_20732.html"); $tmpl->param(WHO=>"valor puesto desde param()"); print ${$tmpl->{param_map}{who}}'
valor puesto desde param
()Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Sí que vemos cómo sacar el valor de la variable. Pero, si ahora hacemos:
Using bash Syntax Highlighting
perl -MHTML::Template
-le '$tmpl = HTML::Template->new(filename=>"code_20732.html"); print ${$tmpl->{param_map}{who}}'Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
No sale nada, porque el módulo no ha guardado el valor por defecto en él. Está vacío. El procesamiento del valor por defecto lo hará solo en el momento de la salida.
Una manera ingeniosa sería colocando un valor especial a la variable WHO. Luego, recorrer el
array que guarda los elementos de la plantilla y localizarlo. Si lo encontramos, el valor por defecto será justo el valor anterior del
array:
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use strict;
use warnings;
use diagnostics;
use HTML::Template;
my $tmpl = HTML::Template->new(filename=>"code_20732.html"); # cargamos la plantilla
$tmpl->param(WHO=>"BANDERA"); # le ponemos un valor ficticio
for my $i (0 .. $#{$tmpl->{parse_stack}}) { # recorremos toda la pila
my $v = $tmpl->{parse_stack}[$i]; # elemento $i-ésimo
if (ref $v eq "HTML::Template::VAR" # si es una TMPL_VAR
and $$v # con un valor puesto
and $$v eq "BANDERA") { # y ese valor es nuestro valor ficticio
print ${$tmpl->{parse_stack}[$i-1]}; # el valor por defecto está una posición antes
}
}
__END__
devil
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Repito que esto es lo que
NO hay que hacer, porque te arriesgas a que no funcione en la siguiente versión.
Algo parecido a lo que quieres hacer se podría conseguir con el módulo
HTML::Template::Set, que funciona igual que el HTML::Template, pero además incorpora la etiqueta TMPL_SET, con la que puedes dar valores a las variables de la plantilla desde la propia plantilla.
Y otra opción... es leer la plantilla e interpretarla con alguna expresión regular.
En CPAN hay más variantes de HTML::Template, con más funcionalidades.