¿Y qué hacemos con el caso de que palabra se encuentre superpuesta en múltiples posiciones consecutivas?
Por ejemplo, tenemos la secuencia "ATCCGGCCTAGCTTACCAGCAAAAAAAAC". Si buscamos por la palabra "AAAAA", ¿cuántos resultados debe darnos, 1 u 8?
Está bien saber que eres estudiante de bioinformática, pues así sabremos que no debemos daros todas las soluciones ya hechas, sino guiaros hasta ellas. Lo bueno de Perl es que hay más soluciones para un mismo problema, así que es más probable encontrar alguna de ellas. Un saludo para el profesor.
Quizás dentro de poco, tengamos un subforo completamente dedicado a bioinformática.
Lo normal es usar
hash, para este problema, pero si dice el profesor que la memoria del ordenador puede agotarse, puede usarse el método de escribir los resultados intermedios a disco.
El caso es que la memoria no tiene por qué agotarse, ya que la memoria ocupada es la del
hash que va almacenando las frecuencias. No hay porqué leer la secuencia entera a memoria, sobre todo cuando son 3Gb.
En Perl hay varios módulos que permiten
mapear el contenido de un fichero en una variable escalar, sin tener que leer el contenido del fichero (precisamente por no caber en memoria). Por ejemplo, el módulo
File::Map. Eso sí, como estamos hablando de un fichero de más de 2Gb, hay que prestar atención a los problemas de estar en sistemas de 32 bits. En la sección PITFALLS de este módulo, se recomienda que, aunque estés trabajando en sistemas de 64 bits y tengas un Perl compilado para 64 bits, es mejor que uses Perl v5.12. Y en la sección de BUGS se comenta que hay un problema con el motor de expresiones regulares, que provocan un fallo de segmentación si el fichero tiene un tamaño que es múltiplo del tamaño de página de lectura. Pero bueno, esto último es fácil de solventar
Solo cuando tenemos estos problemas de espacio es cuando hay que hilar un poco más fino, pero sino, es muy fácil solventarlo.
Una cosa importante: una cosa es un
script y otra cosa es un programa. Un
script es un programa que hace de guión (traducción literal de
script) para la ejecución de
otros procesos. Y no es éste el caso. Lo que el profesor os ha mandado hacer es un
programa. La mayor parte de los programadores de Perl hace
programas, no
scripts.
Si os pide que no utilicéis ninguna librería de Perl, es porque se trata de un ejercicio. En el mundo real, en producción, sí que se usarán librerías de Perl, igual que los programadores de Java, .Net y demás lenguajes no pueden hacer casi nada sin ellas.
Has acertado con lo de leer primero toda la secuencia. En otros hilos hemos comentado cómo leer ese tipo de archivos. En el ejemplo pones File:Slurp, pero recuerda que el profesor dice que no podéis usar ninguna librería, así que no puedes usar File::Slurp.
El problema principal de la tarea es saber qué método usar para localizar las palabras. Y soluciones para esto hay unas cuantas. Incluso sin usar expresiones regulares
Actualización: hay otro hilo donde comentamos este tema:
Contar repeticiones secuencias de bases.