El PPP (Perl PreProcessor)

Como dijimos al principio, todos los ficheros de configuración y de distribución de PICA se preprocesan antes de pasar por el analizador sintáctico. Este componente es uno de los puntos más importantes de PICA, porque es el que le da gran parte de su flexibilidad. Es fácil de usar y entender y da unas posibilidades a la hora de tratar los ficheros a distribuir que, al menos de forma tan sencilla, no hemos encontrado en ninguna otra herramienta.

El preprocesador es una función escrita en Perl que hace las sustituciones necesarias en el fichero, generando uno nuevo ya preprocesado. Es muy parecido al preprocesador de C, pero con algunas diferencias importantes:

La lista completa de opciones que nos da el preprocesador es:

Veamos un ejemplo del preprocesador de PICA en acción, con uno de los ficheros de ejemplo que vienen en la distribución oficial:

Ejemplo 11. Ejemplo de fichero de distribución de PICA

Well, this is just a test file to see if it worked...

The value of the (local) variable myvar is '<# $myvar #>'
The value of the (local) variable mythirdvar is '<# $mythirdvar #>'


$myvar is <# ($myvar lt $mythirdvar)?'less':'greater' #> than
$mythirdvar...

The crypt'ed version of $mythirdvar is '<# crypt $mythirdvar,
'aa' #>'.


Now, a little list from 0 to <# $limit #>:
#perl
my @result;
for (my $i = 0; $i < $limit; ++$i) {
        push @result, "$i\n";
}
@result;
#lrep
    

Suponiendo una definición como la siguiente:

Ejemplo 12. Ejemplo de definición del fichero pica-rules en objects.conf

file pica-rules {
    path = '<#$picaroot#>/rules';	  # Esto también se
                                          # preprocesará
    source = 'pica-rules';

    vars {
       myvar         = 'foo';
       limit         = '2';
       mythirdvar    = 'enough';
    }
}
    

el resultado del fichero, ya preprocesado, sería:

Ejemplo 13. Fichero preprocesado por PPP

Well, this is just a test file to see if it worked...

The value of the (local) variable myvar is 'foo'
The value of the (local) variable mythirdvar is 'enough'


$myvar is greater than $mythirdvar...

The crypt'ed version of $mythirdvar is 'aaVxUBNI9d3lI'.


Now, a little list from 0 to 2:
0
1
    

Esta versión es, naturalmente, la que se instalaría en las máquinas. Nótese además que el fichero de configuración de definición de objetos (objects.conf) y los ficheros de distribución vuelven a leerse y preprocesarse por cada máquina, así que podemos hacer que éstos dependan del objetivo donde se instalarán (ver ejemplo "Creación de varios ficheros a partir de un solo fuente" en el siguiente apartado).