• Publicidad

Variables y Hashes

Perl aplicado a la bioinformática

Variables y Hashes

Notapor pedro19 » 2012-04-25 12:14 @551

¡Hola de nuevo!

Estoy haciendo un programa que me permita leer determinadas líneas de un archivo de modo que en aquella que aparezca "GENE", debe extraer "GENE" y su valor, que son una serie de caracteres que aparecen a continuación de "GENE".

Hasta aquí bien. Ahora debo generar un array asociativo o hash con estos pares de valores y tengo un problema: a la hora de utilizar la variable con que nombré al valor de "GENE" me dice que esta variable no está definida.

Lo primero que pensé fue eliminar los "my", ya que así el ámbito de mi variable no se restringiría, pero aún sin usar "my", no soy capaz de volver a usar esta variable para incluir este valor de "GENE" en el hash.

Con mi variable del valor de "GENE" ($gene1) y con "GENE", ¿podría crear el hash
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. %tgm1= ("gene"=>"$gene1")
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
?

¿Cómo puedo imprimir en pantalla la lista de claves (ya que no sólo es la línea que contiene gene, sino varias más que contienen otros caracteres) y la lista de valores por separado?

He leído temas similares... y lo he probado, pero no me da nada resultado y muchas cosas no las entiendo :?

Gracias de antemano y ¡un saludo! :D
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Publicidad

Re: Variables y Hashes

Notapor explorer » 2012-04-25 14:30 @645

Sin ver el código, es complicado saber qué pasa.

Sí que puedes escribir ese hash.

Si quieres ver el contenido de una estructura de datos, usa a Data::Dumper (o mejor, Data::Dumper::Simple).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper;
print Dumper(\%tgm1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para imprimir las claves valores puedes usar un for() a través de los valores que devuelve keys() o, mejor, usar each() dentro de un bucle while().

Si no entiendes algunas cosas, pues las preguntas aquí, pero debemos verlas para saber cuáles son.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Variables y Hashes

Notapor pedro19 » 2012-04-25 16:05 @712

Es cierto, lo siento. Mi primera duda concreta es cómo usar fuera de esta estructura la variable $gen1, que contiene el valor de "GENE":
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $n eq 'tgm1' ) {
  2.     open( APERTURA, "TGM1.txt" ) or die "no puedo abrir el archivo \"TGM1.txt\": $!";
  3.  
  4.     @lines1 = <APERTURA>;
  5.  
  6.     foreach $lines1 (@lines1) {
  7.         if ( $lines1 =~ /GENE/ ) {
  8.             $genetgm1 = substr( $lines1, 11 );
  9.             @genetgm1 = $genetgm1;
  10.             foreach $gen1 (@genetgm1) {
  11.  
  12.                 print " $gen1\n";
  13.  
  14.             }
  15.  
  16.         }
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ahí sí que imprime el valor de "GENE", pero quiero volver a usar esa variable para introducirla en el hash de la forma en que pregunté anteriormente. No he usado my() y he usado variables distintas para las sucesivas líneas que me interesan... y aun así me ocurre lo mismo. ¿A qué se debe? ¿Cómo lo soluciono?
Última edición por explorer el 2012-04-25 19:36 @858, editado 1 vez en total
Razón: Formateado de código con Perltidy
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Re: Variables y Hashes

Notapor explorer » 2012-04-25 19:54 @870

Yo no veo ningún hash por ninguna parte, pero al menos lo que veo, sí que puedo decirte que no es correcto: estás mezclando operaciones. Estás haciendo la presentación de los $gen1 dentro de la búsqueda de @lines1. Y lo peor, cada vez que se encuentra una línea con GENE, se inicializa @genetgm1 (línea 9 del código).

Mejor así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $n eq 'tgm1' ) {
  2.     open my $APERTURA, '<', 'TGM1.txt'
  3.         or die "no puedo abrir el archivo 'TGM1.txt': $!\n";
  4.  
  5.     my @genes;
  6.  
  7.     while (my $linea = <$APERTURA>) {
  8.         if ($linea =~ /GENE/) {
  9.             push @genes, substr( $linea, 11 );
  10.  
  11.         }
  12.     }
  13.  
  14.     close $APERTURA;
  15.  
  16.     for my $gen (@genes) {
  17.         print " $gen\n";
  18.     }
  19. }
  20.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

De esta manera, vamos almacenando en @genes todos los valores que hay a la derecha de GENE.

Lo que ya no sabemos es cómo guardarlo en ese hash que comentas, porque no nos das más pistas. Hablas de pares de valores, pero no sabemos a qué par te refieres. No sabemos tampoco qué código es el que te marca como erróneo...

¿No puedes crear un programa mínimo que reproduzca el error?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Variables y Hashes

Notapor pedro19 » 2012-04-26 08:57 @415

Copiaré el enunciado del programa porque es difícil de explicar. Disculpas por no ser concreto, pero quería solucionarlo poco a poco para entender punto por punto.

Teniendo presentes los 4 ficheros (‘ADH2’, ‘CEACAM4’, ‘TGM1’ y ‘GLDC’) de formato txt, escribir un programa que efectúe las siguientes operaciones:
  • Permitir al usuario introducir el nombre de uno de los genes por teclado y abrir el fichero correspondiente.
  • Extraer de dicho archivo las líneas correspondientes a los campos:
    ID y su valor
    GENE y su valor
    LOCUSLINK y su valor
    CHROMOSOME y su valor
  • Generar un array asociativo ( o variable Hash) con esos pares de valores.
  • Añadir al array el par de valores correspondientes a la línea del fichero SCOUNT y su valor.
  • Visualizar por pantalla y por separado, la lista de claves (keys) del array y la lista de sus valores (values).
  • Mostrar el array por pantalla de nuevo, pero esta vez se deberán visualizar las parejas de valores por líneas.
  • Borrar el par de elementos añadido anteriormente correspondiente a SCOUNT y su valor, y comprobar que desapareció del array visualizándolo de nuevo.

Bien, me he quedado en el paso dos. Consigo aislar las líneas necesarias e incluso imprimirlas mediante variables, pero lo que quería decir con respecto al Hash, es que no soy capaz de usar estas variables para introducir el par de valores formado por "GENE" y lo que está a la derecha de "GENE" en el hash. Me da errores en mi primer intento de hacer el hash (en la primera parte, la correspondiente al procesamiento de tgm1).

Ahí va mi programa entero hasta la parte 2 :)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use vars;
  2. use diagnostics;
  3.  
  4. print"Escriba el nombre del gen que quiere buscar con la extension txt\n";                     
  5. $n = <STDIN>;
  6. chomp($n);
  7.  
  8. if ($n eq 'tgm1'){                                                                             
  9. open (APERTURA, "TGM1.txt") or die "no puedo abrir el archivo \"TGM1.txt\": $!";
  10.  
  11.         my @lines = <APERTURA>;
  12.        
  13.         foreach $lines (@lines)
  14.         {
  15.                 if($lines=~/GENE/)
  16.                 {
  17.                         my $gene= substr ($lines, 11);
  18.                         my @gene=$gene;
  19.                         foreach my $sel1(@gene)
  20.                         {
  21.                         print " $sel1\n";
  22.                         }
  23.                 }
  24.                 if($lines=~/CHROMOSOME/)
  25.                 {
  26.                         my $chromosome= substr ($lines, 11);
  27.                         my @chromosome=$chromosome;
  28.                         foreach my $sel2(@chromosome)
  29.                         {
  30.                                 print " $sel2\n";
  31.                         }
  32.                 }
  33.                 if($lines=~/Hs/)
  34.                 {
  35.                         my $id= substr ($lines, 11);
  36.                         my @id=$id;
  37.                         foreach my $sel3(@id)
  38.                         {
  39.                                 print " $sel3\n";
  40.                         }
  41.                 }
  42.                 if($lines=~/LOCUSLINK/)
  43.                 {
  44.                         my $locuslink= substr ($lines, 11);
  45.                         my @locuslink=$locuslink;
  46.                         foreach my $sel4(@locuslink)
  47.                         {
  48.                                 print " $sel4\n";
  49.                         }
  50.                 }
  51. #%tgm1= ("id"=>"$sel3", "gene"=>"$sel1", "locuslink"=>"$sel4", "chromosome"=>"$sel2");
  52.         }
  53. close(APERTURA);
  54. }
  55.  
  56. elsif ($n eq 'ceacam4'){                                                                               
  57.     open (APERTURA, "CEACAM4.txt") or die "no puedo abrir el archivo \"CEACAM4.txt\": $!";
  58.  
  59.         my @lines = <APERTURA>;
  60.        
  61.         foreach $lines (@lines)
  62.         {
  63.                 if($lines=~/GENE/)
  64.                 {
  65.                         my $gene= substr ($lines, 11);
  66.                         my @gene=$gene;
  67.                         foreach my $sel1(@gene)
  68.                         {
  69.                                 print " $sel1\n";
  70.                         }
  71.                 }
  72.                 if($lines=~/CHROMOSOME/)
  73.                 {
  74.                         my $chromosome= substr ($lines, 11);
  75.                         my @chromosome=$chromosome;
  76.                         foreach my $sel2(@chromosome)
  77.                         {
  78.                                 print " $sel2\n";
  79.                         }
  80.                 }
  81.                 if($lines=~/Hs/)
  82.                 {
  83.                         my $id= substr ($lines, 11);
  84.                         my @id=$id;
  85.                         foreach my $sel3(@id)
  86.                         {
  87.                                 print " $sel3\n";
  88.                         }
  89.                 }
  90.                 if($lines=~/LOCUSLINK/)
  91.                 {
  92.                         my $locuslink= substr ($lines, 11);
  93.                         my @locuslink=$locuslink;
  94.                         foreach my $sel4(@locuslink)
  95.                         {
  96.                                 print " $sel4\n";
  97.                         }
  98.                 }
  99.         }
  100. close(APERTURA);
  101. }
  102.  
  103. elsif ($n eq 'gldc'){                                                                          
  104.     open (APERTURA, "GLDC.txt") or die "no puedo abrir el archivo \"GLDC.txt\": $!";
  105.  
  106.         my @lines = <APERTURA>;
  107.        
  108.         foreach $lines (@lines)
  109.         {
  110.                 if($lines=~/GENE/)
  111.                 {
  112.                         my $gene= substr ($lines, 11);
  113.                         my @gene=$gene;
  114.                         foreach my $sel1(@gene)
  115.                         {
  116.                                 print " $sel1\n";
  117.                         }
  118.                 }
  119.                 if($lines=~/CHROMOSOME/)
  120.                 {
  121.                         my $chromosome= substr ($lines, 11);
  122.                         my @chromosome=$chromosome;
  123.                         foreach my $sel2(@chromosome)
  124.                         {
  125.                                 print " $sel2\n";
  126.                         }
  127.                 }
  128.                 if($lines=~/Hs/)
  129.                 {
  130.                         my $id= substr ($lines, 11);
  131.                         my @id=$id;
  132.                         foreach my $sel3(@id)
  133.                         {
  134.                                 print " $sel3\n";
  135.                         }
  136.                 }
  137.                 if($lines=~/LOCUSLINK/)
  138.                 {
  139.                         my $locuslink= substr ($lines, 11);
  140.                         my @locuslink=$locuslink;
  141.                         foreach my $sel4(@locuslink)
  142.                         {
  143.                                 print " $sel4\n";
  144.                         }
  145.                 }
  146.         }
  147. close(APERTURA);
  148. }
  149.  
  150. elsif ($n eq 'adh2'){                                                                          
  151.     open (APERTURA, "ADH2.txt") or die "no puedo abrir el archivo \"ADH2.txt\": $!";
  152.  
  153.         my @lines = <APERTURA>;
  154.        
  155.         foreach $lines (@lines)
  156.         {
  157.                 if($lines=~/GENE/)
  158.                 {
  159.                         my $gene= substr ($lines, 11);
  160.                         my @gene=$gene;
  161.                         foreach my $sel1(@gene)
  162.                         {
  163.                                 print " $sel1\n";
  164.                         }
  165.                 }
  166.                 if($lines=~/CHROMOSOME/)
  167.                 {
  168.                         my $chromosome= substr ($lines, 11);
  169.                         my @chromosome=$chromosome;
  170.                         foreach my $sel2(@chromosome)
  171.                         {
  172.                                 print " $sel2\n";
  173.                         }
  174.                 }
  175.                 if($lines=~/Hs/)
  176.                 {
  177.                         my $id= substr ($lines, 11);
  178.                         my @id=$id;
  179.                         foreach my $sel3(@id)
  180.                         {
  181.                                 print " $sel3\n";
  182.                         }
  183.                 }
  184.                 if($lines=~/LOCUSLINK/)
  185.                 {
  186.                         my $locuslink= substr($lines, 11);
  187.                         my @locuslink=$locuslink;
  188.                         foreach $sel4(@locuslink)
  189.                         {
  190.                                 print " $sel4\n";
  191.                         }
  192.                 }
  193.         }
  194. close(APERTURA);
  195. }
  196.  
  197. else{print"gen no valido\n";}
  198.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Re: Variables y Hashes

Notapor pedro19 » 2012-04-26 09:52 @453

Este otro es modificado y es mucho más corto, creo que también vale para lo que quiero, pero me sigue dando errores al usar el hash
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use vars;
  2. use diagnostics;
  3.  
  4. print"Escriba el nombre del gen que quiere buscar con la extensión txt\n";                    
  5. $n = <STDIN>;
  6. chomp($n);
  7.  
  8.                                                                                
  9. open (APERTURA, "$n.txt") or die "no puedo abrir el archivo \"$n.txt\": $!";
  10.  
  11.         my @lines = <APERTURA>;
  12.        
  13.         foreach $lines (@lines)
  14.         {
  15.                 if($lines=~/GENE/)
  16.                 {
  17.                         my $gene= substr ($lines, 11);
  18.                         my @gene=$gene;
  19.                         foreach $sel1(@gene)
  20.                         {
  21.                                 print " $sel1\n";
  22.                         }
  23.                 }
  24.                 if($lines=~/CHROMOSOME/)
  25.                 {
  26.                         my $chromosome= substr ($lines, 11);
  27.                         my @chromosome=$chromosome;
  28.                         foreach $sel2(@chromosome)
  29.                         {
  30.                                 print " $sel2\n";
  31.                         }
  32.                 }
  33.                 if($lines=~/Hs/)
  34.                 {
  35.                         my $id= substr ($lines, 11);
  36.                         my @id=$id;
  37.                         foreach $sel3(@id)
  38.                         {
  39.                                 print " $sel3\n";
  40.                         }
  41.                 }
  42.                 if($lines=~/LOCUSLINK/)
  43.                 {
  44.                         my $locuslink= substr ($lines, 11);
  45.                         my @locuslink=$locuslink;
  46.                         foreach $sel4(@locuslink)
  47.                         {
  48.                                 print " $sel4\n";
  49.                         }
  50.                 }
  51.     %tgm1= ("id"=>"$sel3", "gene"=>"$sel1", "locuslink"=>"$sel4", "chromosome"=>"$sel2");
  52.         }
  53. close(APERTURA);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Re: Variables y Hashes

Notapor explorer » 2012-04-26 19:38 @859

Viendo los archivos que hay que procesar, no necesitas hacer ningún bucle buscando por múltiples valores, ya que cada clave/valor solo aparece una vez en el archivo.

Es más, si tomamos una parte, tenemos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $chromosome = substr ($lines, 11);   # Extraemos el valor asociado
  2. my @chromosome = $chromosome;           # Metemos el valor dentro de un array (?)
  3. foreach $sel2(@chromosome)              # Hacemos un bucle ¿¿¿por un solo valor???
  4. {
  5.     print " $sel2\n";                   # es obvio... sale el mismo valor...
  6. }
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Has escrito 6 líneas... que no hacen nada... :)

Así que con guardar las claves/valor en el hash a medida de que se va leyendo el archivo, debería ser suficiente.

Lo curioso es lo que dice del campo SCOUNT. Primero, agregarle al hash igual que a los primeros cuatro valores, y luego sacarlo. Bueno, en Perl no cuesta nada hacer eso.

El error que te sale, supongo que es porque estás intentando inicializar el hash usando variables que pierden su valor cuando se terminan los bucles for().

Lo dicho: mejor ir guardando los valores a medida de que se va leyendo.

Y, por favor, la primera opción es enorme... e ineficaz, porque estás repitiendo lo mismo, cuatro veces.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Variables y Hashes

Notapor explorer » 2012-04-27 06:00 @292

JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Variables y Hashes

Notapor alexclipse » 2012-05-06 12:11 @549

Estoy haciendo este ejercicio y casi lo he terminado pero tengo un pequeño error que no sé cómo solucionar. El código es:
print "Introduzca el nombre del gen:";
my $gen = <STDIN>;
chomp ($gen);
if ($gen eq "adh2") {
$a = "ADH2.txt";
funcion ($a);
}
elsif ($gen eq "ceacam4") {
$a = "CEACAM4.txt";
funcion ($a);
}
elsif ($gen eq "gldc") {
$a = "GLDC.txt";
funcion ($a);
}
elsif ($gen eq "tgm1") {
$a = "TGM1.txt";
funcion ($a);
}
else {
print "Gen incorrecto";
}
sub funcion {
open (FH1, $a) || die "No se pudo abrir el archivo \"$infile\": $!";
my (@datos, $dato);
@datos = <FH1>;
chomp (@datos);
foreach $dato (@datos) {
if ($dato =~ /ID /) {
$id = substr ($dato,0,2);
$valorid = substr ($dato,12);
}
elsif ($dato =~ /GENE/) {
$gene = substr ($dato, 0, 4);
$valorgene = substr ($dato,12);
}
elsif ($dato =~ /LOCUSLINK/) {
$locuslink = substr ($dato,0,9);
$valorlocuslink = substr ($dato,12);
}
elsif ($dato =~ /CHROMOSOME/) {
$chromosome = substr ($dato,0,10);
$valorchromosome = substr ($dato,12);
}
elsif ($dato =~ /SCOUNT/) {
$scount = substr ($line,0,6);
$valorscount = substr ($line,12);
}}
%conjunto = ("$id" => "$valorid",
"$gene" => "$valorgene",
"$locuslink" => "$valorlocuslink",
"$chromosome" => "$valorchromosome");
print "La lista de datos es: \n";
while (($inicio,$fin) = each (%conjunto)) {
print "$inicio : $fin\n";
}
$conjunto {"$scount"} = $valorscount;
print "Si introducimos SCOUNT la lista de datos es: \n";
while (($inicio,$fin) = each (%conjunto)) {
print "$inicio : $fin\n";
}}

El error está en que al ejecutarlo, en pantalla no me muestra SCOUNT ni su valor. Eso quiere decir que no se ha añadido posteriormente pero no sé por qué no hay error de sintaxis.
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Re: Variables y Hashes

Notapor explorer » 2012-05-06 13:03 @585

No hay error de sintaxis porque no le pides a Perl que te dé avisos de fallos de sintaxis. Si quieres activarlos, debes poner 'use warnings;' al principio del programa.

En cuanto al programa...
  • Llamas a una función funcion() así: funcion ($a);, pero luego, dentro de la función, no lees el argumento $a que le has pasado en la llamada a la función. Tú no notas nada porque dentro de la función estás accediendo a $a como variable global, no como el argumento pasado. Te falta una línea así después de sub funcion {: my ($a) = $_[0];
  • No sale el valor de SCOUNT por exactamente la misma razón que te he repetido varias veces a lo largo de este hilo: el duplicar, triplicar y, -en este caso- cuadruplicar el código puede dar lugar a "olvidos"... En tu código, a la hora de sacar SCOUNT, ¿qué valor tiene $line?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado