Para construir un programa, debes conocer los ladrillos y el tipo de ladrillos que puedes componer para que resuelva el problema.
Debes tener en cuenta las diferencias de funcionamiento entre un
array y un
hash, para poder decidir qué usar a cada momento.
También debes pensar en cómo representar la información que vas a manejar, tanto la de partida, con la lista de aminoácidos que corresponden a cada codón, como la de salida, guardar un contador por cada aminoácido.
Lo mejor es preparar un plan de trabajo de cómo lo resolverías con lápiz y papel.
Ejemplo de resolución:
Problema:
* Dada una secuencia genómica, dividirla en codones.
* Cada codón representa a un aminoácido.
* Contar el número de veces que aparece cada aminoácido en la secuencia.
* Mostrar el aminoácido que más veces aparece.
Una vez que tengo descrito el problema, si hay partes que no están claras, las desmenuzo un poco más.
Por ejemplo, la parte de buscar el aminoácido que más veces se repite se puede describir como:
* Tengo una variable llamada $max que guardará el nombre del aminoácido que más veces se repite
* Tengo una variable llamada $veces que guardará el número de veces que se repite. Inicialmente valdrá 0.
* Hago un bucle por todos los aminoácido que he leído. Por cada $aminoácido, hago:
* Extraigo el $nombre del aminoácido y las $repeticiones que ha tenido
* Si las $repeticiones son mayores que las $veces, es que he encontrado un aminoácido que se repite más veces, luego
* { hago que $veces = $repeticiones, y $max = $nombre, para recordar qué aminoácido es el que más veces se repite }
* Y así para todos los aminoácidos
* Al final, imprimir los valores de $nombre y $veces.
Ya solo me queda pasar lo escrito a Perl, lo cual es muy sencillo porque Perl es un lenguaje muy cercano al natural:
Using perl Syntax Highlighting
my $max;
my $veces = 0;
for my $aminoacido (@aminoacidos) {
my %hash = %{$aminoacido}; # El $aminoacido es una referencia a un hash
my $nombre = $hash{ nombre
};
my $repeticiones = $hash{ veces
};
if ($repeticiones > $veces) {
$max = $nombre;
$veces = $repeticiones;
}
}
print "El aminoacido $max aparece $veces veces.\n";Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Realmente, estoy siguiendo los mismos pasos que yo haría si solo tuviera a mi disposición un lápiz y un papel.
No se trata de forzarte a usar un
hash porque yo lo diga. Solo digo que en problemas similares yo siempre he usado un
hash. Los
hash me sirven para recordar cosas, y en este tipo de problemas, hay que recordar varias (qué aminoácido corresponde a cada codón, un contador por cada aminoácido). Pero, naturalmente, en Perl se puede hacer de muchas otras formas.
En el ejemplo que te he puesto, he elegido una estructura de datos de un
array de
hashes. Eso quiere decir que tengo una lista de valores (el
array), que cada uno de ellos es un
hash, donde guardo el nombre y las veces que aparece un aminoácido. Pero se podría haber hecho como una estructura de un
array de
arrays, o de forma más simple, un
hash, cuyas claves fueran los nombres de los aminoácidos, y los valores, las veces que salen. En este caso, queda incluso más corto:
Using perl Syntax Highlighting
my $max;
my $veces = 0;
for my $nombre (keys %aminoacidos) { # Para todos los aminoácidos
my $repeticiones = $aminoacidos{$nombre}; # Vemos las veces que se repite
if ($repeticiones > $veces) { # ¿Supera el récord?
$max = $nombre; # Sí, nos quedamos con su nombre
$veces = $repeticiones; # y las veces que sale
}
}
print "El aminoacido $max aparece $veces veces.\n";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Ya tienes la parte final de tu programa. Ahora solo tienes que decidir cómo guardar la información mientras vas leyendo. Comienza con algo sencillo: intenta leer los codones desde la secuencia y déjalos en un
array. Publica el código que vayas probando y te echaremos una mano (o un par de teclas, mientras el profesor no se entere).