Desarrollo de la práctica

Para el desarrollo de la práctica se utilizará un sencillo programa escrito en lenguaje Perl. Un programa consiste en un conjunto de instrucciones para llevar a cabo una tarea.  Normalmente el programa está escrito en un fichero y durante su ejecución requiere unos datos de entrada (input) sobre los que opera para conseguir un resultado (output).

En el primer programa que se utilizará en esta práctica <ori_1.pl>, el input es un fichero que contiene la secuencia de un genoma bacteriano. La tarea consiste en obtener las coordenadas en el plano de los puntos recorridos por un cursor que se mueve siguiendo ciertas reglas de acuerdo con la secuencia del genoma. El output es un fichero con las coordenadas de los puntos recorridos por el cursor desde el principio hasta el final de la secuencia.

En este programa hay tres partes:

La primera parte son unas líneas de comentario que comienzan con el símbolo # y contienen una breve descripción del programa. A los programas tan simples como éste los informáticos les suelen llamar un ‘script’.

La segunda parte está formada por una serie de instrucciones que gestionan los ficheros de entrada (input) y salida (output).

La tercera parte es la más interesante del programa y controla la caminata a lo largo de la secuencia con los bucles ‘while’ y ‘foreach’.

El bucle while lee sucesivamente cada una de las líneas del fichero de input y las va asignando también sucesivamente a la variable $linea

while ($linea = <INPUT>)

y así se construye una lista (@bases) con las letras que hay en cada línea separadas de una en una.

@bases = split //, $linea;

El bucle foreach está anidado dentro del bucle while y su misión es recorrer (iterar sobre) la lista de letras que está contenida en la variable @bases y va asignando sucesivamente cada una de las letras a la variable $base.  En lenguaje natural se diría: para cada letra que hay en la lista de letras recién leída hacer las operaciones que se citan entre el par de llaves.

foreach $base (@bases)

Las operaciones sobre la variable $base consisten determinar si se trata de una A, una C, una G o una T comparando el contenido actual de variable $base con cada una de las 4 letras, y en cada caso llevar a cabo la acción especificada entre las dos llaves que siguen a la comparación.

if ( $base eq ‘A’ ) { $x = $x – 1 };

Así, si el contenido de la variable $base es una A, el valor que tenga en ese momento la variable $x (la abscisa) se reducirá en una unidad ( $x – 1 ), y el valor ya reducido se asignará de nuevo a la variable $x. Si el contenido de la variable $base fuera una C se incrementaría en una unidad el valor que tenía $y (la ordenada) y éste pasaría a ser el nuevo valor de $y.

Los genomas bacterianos pueden alcanzar un tamaño considerable, y por tanto los ficheros con las coordenadas del cursor que lo recorre también pueden tener un gran tamaño, así que en esta práctica sólo se utilizarán las coordenadas (Sx, $y) de las posiciones que ocupa el cursor cada 1000 bases leídas, es decir, después, 1000, 2000, 3000 bases etc. En otras palabras, sólo se desean las coordenadas del cursor cuando esté ocupando sitios del genoma cuyas posiciones son múltiplos de 1000.

Para llevar la cuenta del número de bases leídas se ha incluido un contador dentro del bucle foreach, de modo que cada vez que se lee una base, se incrementa el valor de la variable $sitio en una unidad

$sitio = $sitio + 1;

Para saber si el cursor está en una posición múltiplo de 1000,  se calcula el resto de la división del valor de la variable $sitio entre 1000 con el operador ‘%’, y si éste vale 0

if (($sitio % 1000) == 0 )

se escriben en el fichero de salida las coordenadas $x y $y separadas por un tabulador ‘\t’y se salta a la siguiente línea ‘\n’ pa escribir los valores den el fichero de output

print OUTPUT “$x\t$y\n”;

El programa finaliza cuando se haya examinado la última base de la última línea del fichero de input. Y como resultado queda el fichero de resultados en el directorio activo, que contiene tantas líneas como posiciones hay en el genoma que sean múltiplos de 1000.