Mojolicious::Lite 4. Código perl en los patrones

Estas es una tabla con los marcadores que incluyen código perl en un patrón.

Enlace a Perl insertado, en la documentación original de Mojolicious

En líneas independientesEntre otro textoDescripción
%<% %>Código Perl
%#<%# %>Comentarios
%=<%= %>Inserta expresión con secuencias de escape
%==<%== %>Inserta expresión sin secuencias de escape
%%<%% %>Secuencia de escape del carácter %
  • Estas secuencias de escape, indican que Mojolicious debe interpretar esa parte del patrón como código perl, y ejecutarlo.
  • Las secuencias %, %#, %=, %== y %% deben ir al principio de la línea. Indican que toda la línea es código perl.
  • Las secuencias <% %> <%# %> <%= %>,<%== %>,<%% %> delimitan código perl, dentro de texto normal. Sus funciones se corresponden con las marcas para líneas.
  • Las expresiones, indicadas con %=, %==, <% y <%= , incorporan automáticamente el punto y coma “;”.
  • Los valores que devuelven las expresiones, se incorporan al texto del patrón.
  • La diferencia entre = y == reside en que en el primer caso se reemplazan caracteres con secuencias de escape XML, en el segundo caso no.
  • Los espacios en blanco adjuntos a las etiquetas pueden eliminarse añadiendo un signo igual en la etiqueta de cierre.

Ejemplos

Además de utilizar el navegador, también podemos llamar al servidor desde la línea de comandos, con programas comunes en cualquier distribución de Linux, como curl o wget.

En este caso, prefiero curl.

## Utilizando curl
clear; curl http://127.0.0.1:3000/index.html

### Utilizando wget
clear; wget -nv -O-  http://127.0.0.1:3000/index.html
### La opción -q de wget no conviene porque suprime todos los mensajes de error
clear; wget -q -O-  http://127.0.0.1:3000/index.html

Todos los ejemplos los ejecutamos con morbo, con los valores por defecto. Morbo arranca el servidor web y a partir de ahí hacemos llamadas con el navegador, curl, o cualquier otro programa

## Arrancar el servidor
morbo ej_1.pl

Todos los ejemplos son iguales hasta la sección __DATA__, por lo que a partir del segundo, solo se presenta el patrón y el resultado.

Ejemplo 1. Asignar e imprimir una variable.

#!/usr/bin/perl
use strict;
use Mojolicious::Lite;

get 'index';
app->start;

## Fichero: ej_2.pl
__DATA__

@@ index.html.ep
Inicio 
%  my $prueba="<Hola>";
%=$prueba
%=$prueba
Fin

Inicio 
&lt;Hola&gt;
<Hola>
Fin


Se asigna una variable local, y se incorpora al patrón.

La instrucción de asignación es código perl puro, y lleva punto y coma.

La segunda instrucción incluye el resultado en el patrón. Los símbolos < y > se sustituyen por secuencias de escape. La expresión no necesita punto y coma.

Ejemplo 2. Atención a los espacios en blanco

@@ index.html.ep
Inicio 
% my $prueba="<Hola>";
%=$prueba
%==    $prueba
    %==$prueba
Fin

Inicio 
&lt;Hola&gt;
<Hola>
    <Hola>
Fin

Igual que el anterior, con una expresión más, para mostrar el ejemplo del espacio en blanco.

Ejemplo 3. Cuidado con la instrucción return.

@@ index.html.ep
Inicio 
% return "Uno\n";
% return "Dos\n";
% return "Tres\n";
Fin

Uno

El patrón consiste en el resultado devuelto por la expresión return. En este caso el primero, ya que el resto no se ejecuta.

Normalmente, no es lo que se desea.

Ejemplo 4. Utilizando etiquetas

@@ index.html.ep
% my ($nombre,$direccion,$ocupacion)=qw/Angel Quito Sistemas/;
@@ index.html.ep
% my ($nombre,$direccion,$ocupacion)=qw/Angel Quito Sistemas/;
<p>
  <span><%=   $nombre      %> </span>
  <span><%=   $direccion   %> </span>
  <span><%=   $ocupacion   %> </span>
</p>
<p>
  <span><%=   $nombre      =%> </span>
  <span><%=   $direccion   =%> </span>
  <span><%=   $ocupacion  . " Comprobando  " . " espacios  " =%> </span>
</p> 


<p>
  <span>Angel </span>
  <span>Quito </span>
  <span>Sistemas </span>
</p>
<p>
  <span>Angel</span>
  <span>Quito</span>
  <span>Sistemas Comprobando   espacios  </span>
</p>


Utilización de expresiones, para incorporar al patrón el valor de algunas variables.

Cuando la etiqueta se cierra con =%>, desaparecen los espacios alrededor de las etiquetas.

Ejemplo 5. Creando una tabla HTML

@@ index.html.ep
  % use Data::Dumper;
  % my @data=(
  %     [qw/Silvia Gonzalo Linares/],
  %	[qw/Manuel Delgado Valdez /],
  %     [qw/Antonio Colorado Alba/]
  % );
  %# Volcar la estructura
  %== Dumper(\@data)
  %#
  %# Segunda parte. Crear un cuerpo de tabla.
  %#
  <tbody>
  % for (@data) {
    <tr><td> <%== join('</td><td>',@$_) =%> </td></tr>
  %};
  </tbody>
  %# Sentencia equivalente
  %# %== dumper(\@data) 

 $VAR1 = [
          [
            'Silvia',
            'Gonzalo',
            'Linares'
          ],
          [
            'Manuel',
            'Delgado',
            'Valdez'
          ],
          [
            'Antonio',
            'Colorado',
            'Alba'
          ]
        ];

  <tbody>
    <tr><td>Silvia</td><td>Gonzalo</td><td>Linares</td></tr>
    <tr><td>Manuel</td><td>Delgado</td><td>Valdez</td></tr>
    <tr><td>Antonio</td><td>Colorado</td><td>Alba</td></tr>
  </tbody>



Utilizamos el módulo Data::Dumper de Perl, para volcar los valores de una estructura.

También utilizamos comentarios.

El patrón mezcla texto con un bucle Perl para crear el cuerpo de una tabla.

Hay que prestar atención a cerrar correctamente las etiquetas y finalizar con punto y coma las sentencias que lo necesiten.

Nota: Mojolicius provee directamente un helper ( función auxiliar ) llamado dumper, por lo que hay expresiones más directas para hacer esto.

Ejemplo 6. Las variables y rutinas del programa, no son visibles desde el código de los patrones

#!/usr/bin/perl
use strict;
use Mojolicious::Lite;


my $texto_externo="Texto externo";

print "$texto_externo\n";
print mensaje_externo(),"\n";

get 'index';
app->start;

sub mensaje_externo {
  return "Desde Fuera";
}

__DATA__

@@ index.html.ep

  % sub mensaje_interno {
  % return "Desde Dentro";
  %};

% my $texto_interno="Texto interno";
%= $texto_interno
%= mensaje_interno()
%#= $texto_externo    <%# Si se quita el comentario, el patrón falla %>
%#= mensaje_externo() <%# Si se quita el comentario, el patrón falla %>


En un patrón, podemos definir funciones y variables, y utilizarlas, pero no podemos llamar a ninguna variable o función, del resto del programa.

Si quitamos los comentarios de alguna de las dos últimas líneas, y solicitamos la página al servidor, este devolverá un error.

Desde el patrón no se ven las variables o las rutinas fuera de su entrono.

Aquí vemos, que al arrancar el servidor, se imprimen los siguientes mensajes en la consola.

$ morbo ej_6.pl
Server available at http://127.0.0.1:3000
Texto externo
Desde Fuera

Cada vez que se llama al servidor, se procesa el patrón

clear; curl http://127.0.0.1:3000/index.html

Texto interno
Desde Dentro

Más adelante se mostrarán las distintas maneras de conectar el código de un patrón con rutinas externas.

No olvidar

  • Los puntos y comas en las secuencias % y <% %>
  • Cada patrón es como un programa independiente. Las variables y los módulos referenciados son locales a ese patrón.