• Publicidad

Salida de secuencias según la clave del hash

Perl aplicado a la bioinformática

Salida de secuencias según la clave del hash

Notapor Alfumao » 2010-01-21 06:44 @322

Hola a todos :wink:

¿Es posible obtener los valores almacenados en un hash, ordenados en un archivo de salida?

Es decir, los hash almacenan pares {clave=>valor}, pero no los mantienen en orden en la memoria. ¿Se pueden sacar todos los pares {clave=>valor} ordenados alfabéticamente respecto de las citadas claves, y escribirlos en un archivo de salida manteniendo dicho orden?

Disculpad si es una pregunta tonta, pero utilizando la siguiente expresión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach $key (sort keys %hash) {
    print "$key => $hash {$key}\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


(Extraída del capítulo 5 del libro "O'Reilly - Learning Perl")

No consigo sacar ordenados los elementos del array, y me preguntaba si esa posibilidad realmente existe en Perl.

Un saludo y muchas gracias por vuestra atención.
Última edición por explorer el 2010-01-21 07:21 @347, editado 1 vez en total
Razón: Tildes
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Publicidad

Re: Dividir en codones

Notapor explorer » 2010-01-21 07:23 @349

A ver, que no me aclaro... ¿quieres sacar ordenados por la clave o por los valores?

Si es por la clave, es el código que has puesto. Naturalmente, es ordenación alfabética.

¿No nos puedes poner un ejemplo de lo que tienes y de lo que quieres obtener?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dividir en codones

Notapor Alfumao » 2010-01-21 12:55 @580

¡Hola de nuevo, Explorer!

No sé si recordarás una duda que me resolviste sobre cómo extraer un grupo de secuencias cuyos nombres aparecen en una lista, de entre los miles secuencias de un archivo FASTA http://perlenespanol.com/foro/problema-sobre-utilidades-de-perl-y-bioperl-t4633.html

Pues por ejemplo, se trataría de que las secuencias extraídas aparecieran en orden (respecto de su nombre o "clave") en el archivo de salida.

No sé si me he explicado bien...

Un saludo.
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Dividir en codones

Notapor explorer » 2010-01-21 13:02 @585

Te has explicado bien. Y debería funcionarte el código indicado antes.

¿Por qué no preparas un código pequeño, con unas secuencias en un hash, y nos muestras tu intento de sacarlas ordenadas?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dividir en codones

Notapor Alfumao » 2010-01-26 10:50 @493

Siento el retraso, explorer...

Aquí va el código, está basado en el que tú diseñaste con pequeñas modificaciones...

Un saludo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. #ESTE PROGRAMA DEBERIA BUSCAR SECUENCIAS EN UN FASTA
  7. #Y LAS DEVUELVE ORDENADAS
  8.  
  9. # Lectura del fichero de secuencias
  10. my %es_interesante;
  11. print "Pon el nombre de tu lista:\n";
  12. my $entrada = <STDIN>;
  13. open(SEQ,"$entrada") or die ("ERROR: $!\n");
  14. while (my $linea = <SEQ>) {
  15.     chomp $linea;
  16.     $es_interesante{$linea} = 1; # la almacenamos en la memoria asociativa
  17. }
  18. close SEQ;
  19.  
  20. # Lectura del fichero FASTA
  21. my $nombre_secuencia; # Guarda el nombre de cada secuencia
  22. my $secuencia = ''; # Contenido de la secuencia interesante
  23.  
  24. open  SALIDA,'>secuencias.txt' or die "ERROR: $!\n";
  25. print "Pon el nombre de tu Genoma fasta:\n";
  26. my $genome = <STDIN>;
  27. open(FASTA,"<$genome") or die ("ERROR: $!\n");
  28.  
  29.  
  30. while (my $linea = <FASTA>) {
  31.  
  32.     if ($linea =~ /^>(\w+)/) { # Comienzo de una secuencia nueva
  33.  
  34.         if ($secuencia) { # Si tenemos una ya leída...
  35.             procesar_secuencia($nombre_secuencia, $secuencia);  # la procesamos
  36.         }
  37.  
  38.         $nombre_secuencia = $1;  # Nombre de la secuencia extraída desde la exp. reg.
  39.         $secuencia = ''; # Reiniciamos nuestra secuencia a capturar
  40.  
  41.         next; # pasamos a la siguiente línea
  42.     }
  43.  
  44.     if ($es_interesante{$nombre_secuencia}) { # Si estamos en una secuencia interesante
  45.         $secuencia .= $linea; # la guardamos
  46.     }
  47. }
  48.  
  49. close FASTA;
  50.  
  51.  
  52. if ($secuencia) { # Si aún queda alguna $secuencia por sacar
  53.     procesar_secuencia($nombre_secuencia, $secuencia); # la procesamos
  54. }
  55.  
  56. #Ordenar claves
  57.  
  58. foreach my $es_interesante  (sort keys my %es_interesante) {
  59. print "my $es_interesante => my $es_interesante{my $nombre_secuencia}\n";
  60. }
  61. (my $linea, $secuencia) = @_;
  62. print SALIDA "> $nombre_secuencia\n$secuencia";
  63.  
  64.  
  65. sub procesar_secuencia {
  66.     my ($nombre, $secuencia) = @_;
  67.     print SALIDA ">$nombre\n$secuencia";
  68. }
  69.  
  70. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Dividir en codones

Notapor explorer » 2010-01-26 11:00 @500

En las líneas 58 y 59 sobran los 'my'.

my() es un operador para declarar variables locales en el contexto.

Al llegar al for(), estabas declarando una NUEVA variable %es_interesante. Y claro, está vacía.

Y no entiendo para qué sirve la línea 61.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dividir en codones

Notapor Alfumao » 2010-01-27 06:33 @314

Pues si hago los cambios que me dices me sale este mensajito...

Imagen

http://img141.imageshack.us/i/perlerror.png/
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Dividir en codones

Notapor explorer » 2010-01-27 07:27 @352

Has quitado un my() que no debías :)

foreach my $es_interesante (sort keys %es_interesante) {

P.D. No pongas volcados de imágenes. Copia el texto del error. Vete a la esquina superior izquierda de la ventana de la línea de comandos y podrás iniciar el proceso de copia del texto de la ventana.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dividir en codones

Notapor Alfumao » 2010-01-27 10:11 @466

De acuerdo, Explorer, y muchas gracias por tu pronta y exhaustiva revisión.

Mañana espero poder probar el programa y comentarte lo bien que funciona. ;)

Un saludo a todos.
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 17 invitados

cron