Bienvenido a los foros de Perl en español, Dixan_Megaperl.
En este hilo comentamos otra solución.
Primero, leemos el fichero con los cromosomas y sus posiciones. Guardamos la información en una estructura de
hash de
array de
array (por cada cromosoma tenemos un
array, que guarda
arrays con la posición e ID.
Segundo, hacemos una reordenación numérica (de menor a mayor) de las posiciones de los cromosomas.
Tercero, abrimos el fichero con los rangos. Por cada línea, primero comprobamos si tenemos información de ese cromosoma, y si es así, hacemos un bucle por todas las posiciones de ese cromosoma. Como están ordenadas numéricamente, es fácil saltar por las posiciones que son menores al inicio del rango. Una vez que encontramos una posición mayor que el inicio del rango, comprobamos si está antes del final del rango, y si es así, pintamos la información de la coincidencia, y terminamos el bucle.
Y es casi lo mismo a lo que tienes hecho, salvo que tu no miras por la coincidencia del nombre del cromosoma, sino que estás mirando todas las posiciones para todos los rangos.
Tu solución quizás se pueda acelerar, si eliminas los split(), y cambias la estructura de datos, de una dimensión a dos (
array de
array) (habría que lanzar un Benchmark, para comprobarlo).