• Publicidad

Problema sobre utilidades de Perl y BioPerl

Perl aplicado a la bioinformática

Re: Problema sobre utilidades de Perl y BioPerl

Notapor Alfumao » 2009-12-12 08:20 @389

Hola de nuevo Explorer,

Hice los cambios que me dijiste y lo probé de nuevo (perdona por las tildes, no las suelo poner y no sabía que era necesario en el foro), pero sigo sin conseguir que funcione (el archivo de salida sigue estando vacío, ¿será problema de donde está colocada la orden " print SALIDA ">$nombre\n$secuencia" " .

Al hilo de esto tengo una pregunta:
No puedo ver los mensajes de error del programa porque la ventana de ejecución solamente es un "destello", es decir, que no se queda abierta más que unos instantes o mientras corre un programa (no puedo leer los mensajes de error).
Mi Perl está instalado en la carpeta: "C:/perl/bin/perl.exe" (uso windows), ¿será problema de encabezamiento de los programas o es que el Windows XP/VISTA no corren bien Perl?

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

Publicidad

Re: Problema sobre utilidades de Perl y BioPerl

Notapor explorer » 2009-12-12 08:46 @407

A ver...

Las tildes no son importantes para este foro, sino para Google. Así, más perleros se pasarán por aquí.

Acabo de bajarme los dos ficheros, el seq.txt y el FASTA.txt, y los he dejado en el mismo directorio donde está el programa. Luego, el programa, he modificado la línea 24 según la última indicación, a

if ($linea =~ /^>(\d+)/) { # Comienzo de una secuencia nueva

Como, además, yo estoy en Linux, estoy obligado a que los nombres de los ficheros se distingan según estén en mayúsculas o no, por lo que también he editado la línea 20 y dejarla en

open FASTA, '<FASTA.txt' or die "ERROR: $!\n";

(vamos, poner en mayúscula el nombre del fichero).

He ejecutado el programa y ha generado un fichero salida.txt con este contenido:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>23766
KWRGKLVKRKYAFGEKDVPKGESQWFKVVYGFDEPQLPSNISSPNISRVFGTNTTAFELLVLKRKIMGPC
WLQVKEPKLEHKGVSWCKVEATVSNPKDINPFAETDQQAPRGTPPLTVVSLSLRTIVNHKENNREIVCAT
ARICNAVDLDDPTPPEALPCMVRTFVRPLDRFPSNFEVRAAKNGKGVISPQKNERMLLNNLLVTIHKADP
DAIVGHEVLGVSLDVLLHRMRDLKADHWSRIGRFRRSKWPNIGRQGTNLKFMNGRLLCDLASDSAKGMIS
STTWSLTEMCKTHLKSDRQDIDPDDTASYFDSSVSSPDRLLTFVRHCELDAHYQMALAAKVQILPLTRQL
TNLAGNSWNKTLNGGRAERNEYILLHEFHRLKYICPDKLWGKKAATAEKEAHDDDAEGGKVTKSKKDKYK
GGLVFEPKRGLWDKYILVMDFNSLYPSIIQEYNIDFTTVDRAEDEVRADGEEAIPEPPSPGVGQGVLPRL
IATLVNRRRQVKSLMKDRKATQAQLLQWDIKQMALKLTANSMYGCLGFEYSRFYARPLAALTTFKGREI
>27952
LNTFHYAGVSSKNVTLGVPRLKEIINVATNIKTPSLSVYLEPEIAKDKILANSVQQELAYTSLRTVTAAV
EIWYDPEPTSTIIEEDSIFVESFFAIPDDEVEQKLHLQSPWLLRLELDRAKMIDRKLTMSYVAGRIAESF
KTDLFVIWSEDNSEKLIIRCRVLGGADKDEDGMETVEEDIFLRQLENTMLNSISLRGVPGIQRVFLLEHD
KVVVTEEGSIKAHQEKEWVLETDGVNLKTVMCVEGVNFKRTYSNSCVEIFNV
>96101
MADEGPLAPNQFTFAALFRGLSWRRATSGGPEAQAAMCARNASDVKLLWRQMLKIAEKNPQFEFDSHLIT
PAISALASGSPSDQLFAFDIVRDYLGLTKPGETPQPPRVQLSTHLLGEVLYLCNSSQKYRLGVHFFRQVV
DHPDNRAIITHRHVETVIKLFAGMSMMGSDEASAQALETLEWLLQEEASARNAGDLRPTITTFSLVLNVC
WRNGDWASATRTFELMTGYNPDDFADGSRVKEPEMQKRSPGRNIKLDTPAMAHIAHTALASQELANMRQC
LRIIDHIGAERLLHRPKALVDQSRSSQFMNDLEYYLAKLAKDLMEIVDEVVAKEPEMCSEEERERWKKIK
SQAKECRRYARPTRTPHTEESPLGSQRGLDATASAVDQEFSVRRTLRPSRLCMVHAYLVRRFHVTVKYPS
NLQSSTLGTHATDIGRSCISDTGRSPEMGLENAGDGGTNASSETAIDTGWYAPPGESPLIRPTVDMVFIG
IGATRPGALRARVLPRALRRKKYTAPATTSRISTSALNAMSASTAGIKLLTRSRDVMTSLESATVVEPEP
EVVVLAALGLVGIDQGEEFDVWVAHLARRVVVAKVIDGVNGTQDVVADQPVTIRMFCDHTFCKARSTYNS
PPPTETDWGINVPTQVDESLTKASDNDGIPKLQGDVDFGITGHNPLP*
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Si dices que ves un "destello" es que no estás ejecutando bien el programa. Lo estás ejecutando con un doble clic sobre el icono que representa el código fuente. Eso sólo lo debes hacer cuando sepas que el programa funciona bien.

Mientras tanto, lo que tienes que hacer es abrir una ventana de línea de comandos de MSDOS (Inicio->Ejecutar->cmd.exe, por ejemplo), colocarte en el directorio donde está el código fuente (con el comando cd), y ejecutarlo como si fuera un script bat (de forma directa). Si el Windows dice que no sabe qué es lo que quieres hacer, entonces pones "perl" delante del nombre del programa. Algo así:

C:\Tesis\Perl\prueba1> perl programa.pl

Y no te preocupes por Perl en Windows... hay centenares de miles de personas en todo el mundo que ejecutan programas Perl en Windows XP/Vista todos los días a todas horas y no tienen ningún problema.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema sobre utilidades de Perl y BioPerl

Notapor Alfumao » 2009-12-12 13:43 @613

Eres grande Explorer,

No solo por ser un programador muy eficiente, sino por tu paciencia y dedicación para con todos los que intentamos aprender este lenguaje tan interesante que es el Perl.

No era fallo de tu código, sino de mi lista, que por alguna razón (mea culpa) tenía mal copiados los números identificadores de las secuencias.

Lo dicho, muchas gracias, espero poder modificar un poco el programa para hacerlo más interactivo y lo postearé en este mismo hilo para que otras personas puedan usarlo también.

Un saludo y mi admiración más profunda para Explorer ;)

Álvaro
Última edición por explorer el 2009-12-12 13:52 @619, editado 1 vez en total
Razón: PERL => Perl
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Problema sobre utilidades de Perl y BioPerl

Notapor Alfumao » 2013-05-13 05:46 @282

Hola explorer,

Me acaba de saltar un error que nunca había aparecido con este código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Use of uninitialized value $nombre_secuencia in hash element at explorer_sequences.pl line 40, <FASTA> line1

###el mensaje anterior se repite por cada línea del archivo que lee el programa###

(W uninitialized) An undefined value was used as if it were already
    defined.  It was interpreted as a "" or a 0, but maybe it was a mistake.
    To suppress this warning assign a defined value to your variables.

    To help you figure out what was undefined, perl will try to tell you
    the name of the variable (if any) that was undefined.  In some cases
    it cannot do this, so it also tells you what operation you used the
    undefined value in.  Note, however, that perl optimizes your program
    anid the operation displayed in the warning may not necessarily appear
    literally in your program.  For example, "that $foo" is usually
    optimized into "that " . $foo, and the warning will refer to the
    concatenation (.) operator, even though there is no . in
    your program.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El script es este (me lo pasaste hace ya más de 4 años y siempre funcionó correctamente...)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. # Lectura del fichero de secuencias
  6. my %es_interesante;
  7. print "Enter your list name:\n";
  8. chomp(my $entrada = <STDIN>);
  9. open(SEQ,"$entrada") or die ("ERROR: $!\n");
  10. while (my $linea = <SEQ>) {
  11.     chomp $linea;
  12.     $es_interesante{$linea} = 1; # la almacenamos en la memoria asociativa
  13. }
  14. close SEQ;
  15.  
  16. # Lectura del fichero FASTA
  17. my $nombre_secuencia; # Guarda el nombre de cada secuencia
  18. my $secuencia = ''; # Contenido de la secuencia interesante
  19.  
  20. open  SALIDA,'>secuencias.txt' or die "ERROR: $!\n";
  21. print "Enter your genome fasta name:\n";
  22. my $genome = <STDIN>;
  23. open(FASTA,"<$genome") or die ("ERROR: $!\n");
  24.  
  25.  
  26. while (my $linea = <FASTA>) {
  27.  
  28.     if ($linea =~ /^>(\w+)/) { # Comienzo de una secuencia nueva
  29.  
  30.         if ($secuencia) { # Si tenemos una ya leída...
  31.             procesar_secuencia($nombre_secuencia, $secuencia);  # la procesamos
  32.         }
  33.  
  34.         $nombre_secuencia = $1;  # Nombre de la secuencia extraída desde la exp. reg.
  35.         $secuencia = ''; # Reiniciamos nuestra secuencia a capturar
  36.  
  37.         next; # pasamos a la siguiente línea
  38.     }
  39.  
  40.     if ($es_interesante{$nombre_secuencia}) { # Si estamos en una secuencia interesante
  41.         $secuencia .= $linea; # la guardamos
  42.     }
  43. }
  44.  
  45. close FASTA;
  46. close SALIDA;
  47.  
  48. if ($secuencia) { # Si aún queda alguna $secuencia por sacar
  49.     procesar_secuencia($nombre_secuencia, $secuencia); # la procesamos
  50. }
  51.  
  52. sub procesar_secuencia {
  53.     my ($nombre, $secuencia) = @_;
  54.         foreach $nombre (sort keys %es_interesante) {
  55. #print "$nombre => $secuencia\n";
  56.     print SALIDA ">$nombre\n$secuencia";
  57. }
  58. }
  59. _END_
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


A ver si encontramos cuál puede ser el error... Yo ya estoy empezando a ver chiribitas, ¡ja,ja,ja,ja!

:wink:
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Problema sobre utilidades de Perl y BioPerl

Notapor explorer » 2013-05-13 05:50 @285

Seguramente el archivo FASTA no comienza por una línea de cabecera '>....'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema sobre utilidades de Perl y BioPerl

Notapor Alfumao » 2013-05-13 07:11 @341

Este es un trozo del FASTA:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>Cryvi1_75
MSSRRSERPRKRPTPIDAHYDSTSVTTASVQPRSTSSAAASSSKLTLGTDGVVKEGDVGTLAAGREKARA
KGKARVRGKRRVEEEEGEVRNAEVMESEADGHLDEEPERGGSADRTKSEEGEEDEEDPVWQEFSQEYYEV
VEQLPLEIHRNFALLHELDDQTQRQTGQLLELIRRYVARRLPSPVPEELGVPLPVIQAPQAVVRSPRPKE
ENGQEGTKTVVPEEGAETVETREEERTALLAGEGVEVEGFGGSPSRNGQAAADEVTMTQPDSGTPGEAQD
TEMQDTATDVVVPTNTLDVNAHSPGAQAPPADAQTPTISGEAHDSSNPSALNHQPPQLSSARSTSAQRIE
TLKARQTDMYAHQLVPAMASRVLLPEIGKLARDMLRSADEKVGIAIGTYNTVDRHIRSLDAALQAQQAAL
NLGIRQDTLPSKAVTGSTTTAEQEPSSLTLQVGAKADARSTMIPPAVDGGKDTAGERRVGKNWRKGLKGV
PGDSRRRAPDALDVGLSTMRGAEPGKVVGEPTPIVLGYMAAHNFDLAIDPNEPRYCFCQNVSYGEMVGCE
NLDCPNGGWFHLGCLGMSSAPQGKWWCDQCKPKDQASGQKRKKRKIKF
>Cryvi1_342149
MSGNYALNHPNNNPPKMLMFSVFKTLTEQVVTVELKNDLCLMGTLKSVDQFLNIRLDNIQVSDPERFPHM
MSVKNCFIRGSVVRYVQIPRTAVDTTLLEDATRREAQEGKK
>Cryvi1_322066
MPLAALKNAYDETLLENTATLVQVESALRNVTWFLPGRFQDAELASEGVYSVLSLVSLYHDSIISRRLKQ
VQRLPASPFARKQPTKETDVPATTTTFPDDPLTTGESDLGQVLPLPSDHARYTEHFSRSSGVYRTASRAL
VVLGYVQLLLEMIVVRGRGKGRHEDREGGRWKRWKVLLWLEAVKTALRLSLLATTKRPVLAFPLPQREID
PSILAQPTDESPVSTEPSTTTIPRLVTAFPSNAPAHAYLTPLLPRLPEAYQPDPESLLPRLQGWREWLGE
TMNASEGLVVVTVYTWLAAQRRKEGSPGSGMMYLARSSRWTSTLPVLWVLLARLLRRKAGSSINPMAQLA
SLGQPAPRNEGKITPLLAETYAARDRALVFHLVRGAIWQRWTRDKVMRLVRGLDRVWGVRLVAGIVRDHV
DLVDEYYYYTAT
>Cryvi1_302215
MSNFNNSSNGLTDLGLGAPIGGGSHTSSLTQGQNFNTLSTSAGAPIGTGLSGGSHDHHHVHDSNCGHSRE
EDRHIHDANCGHSREEDRHIHDANCGHSYDDNRHSSMTGNFGGDTRNTTSGDQGLGRGHGGTTAFEADPS
KVGEGHRSVGERAGERLTGRDASSSTGHHDQSRSGLTSGSGLSSGAGSHSHHGAGVASAGMAATAGAVGL
TGREATQMDADGVIADSVTGQVHFVESSLTGTNIGSGVGHSTSGAGLGAGAAGLGAGTGLASHGQQQGGL
TDKLRGQSTSTGQQGGPLAELKQELKDHQSGHGADHPESKGPHGLVWHNGKYVHERELSGHGSTGVPLR
>Cryvi1_274
MSTPGQESEVVIHHLNNSRSERIFWALEELNIPYEVKVYLRNPIAAPKELKQVHPLGKSPVITDHGKAIA
ESGTIIDYLIHAYNPASSHREFNLADSYWSHYSEGSLMLFLQMALVFIVSGQQAPWFVKPVITGFVNTVK
STYLVKQIQSSVDYMESELGKNPDGWFSGRSEPGAGDFMMCYPINVLVNTDRMPEIQIGPNLRKWMKAVE
AR
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Creo que ese no va a ser el error... también he mirado el final de línea y es el de Linux: "LF".
La lista además también está correcta en cuanto a saltos de línea y todo...

Eso sí, he encontrado un curioso final de línea "\par" en el Archivo FASTA...

PD. He leído algo por Internet y parece que es el salto de línea del LaTeX o algo así... :shock:
¿Cómo narices ha podido pasar algo así si yo no uso ese editor de texto?
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Problema sobre utilidades de Perl y BioPerl

Notapor explorer » 2013-05-13 08:06 @379

El programa que has puesto tiene algunos errores. Aquí te pongo la versión corregida.

De todas maneras, lo he probado con el archivo FASTA que has mandado, y no sale el error que pusiste.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my %es_interesante;                     # indica qué secuencias son las interesantes
  7.  
  8. # Lectura del fichero de secuencias
  9. print "Enter your list name: ";
  10. my $entrada = <STDIN>;
  11.  
  12. open(SEQ,"$entrada") or die ("ERROR: $!\n");
  13. while (my $linea = <SEQ>) {
  14.     chomp $linea;
  15.     $es_interesante{$linea} = 1;
  16. }
  17. close SEQ;
  18.  
  19. # Lectura del fichero FASTA
  20. my $nombre_secuencia;                   # Guarda el nombre de cada secuencia
  21. my $secuencia = '';                     # Contenido de la secuencia
  22.  
  23. print "Enter your genome fasta name: ";
  24. my $genome = <STDIN>;
  25.  
  26. open(FASTA,"<$genome") or die ("ERROR: $!\n");
  27.  
  28. print "La salida se guarda en secuencias.txt\n";
  29. open  SALIDA,'>secuencias.txt' or die "ERROR: $!\n";
  30.  
  31. while (my $linea = <FASTA>) {
  32.  
  33.     if ($linea =~ /^>(\w+)/) {          # Comienzo de una secuencia nueva
  34.  
  35.         if ($secuencia) {               # Si tenemos una secuencia leída...
  36.             procesar_secuencia($nombre_secuencia, $secuencia);          # la procesamos
  37.         }
  38.  
  39.         $nombre_secuencia = $1;         # Nombre de la secuencia extraída desde la exp. reg.
  40.         $secuencia = '';                # Reiniciamos nuestra secuencia a capturar
  41.         next;                           # pasamos a la siguiente línea del archivo FASTA
  42.     }
  43.  
  44.     if ($es_interesante{$nombre_secuencia}) {   # Si estamos en una secuencia interesante...
  45.         $secuencia .= $linea;                   # la guardamos
  46.     }
  47. }
  48.  
  49. if ($secuencia) {                       # Si aún queda alguna $secuencia por sacar...
  50.     procesar_secuencia($nombre_secuencia, $secuencia);                  # la procesamos
  51. }
  52.  
  53. close FASTA;
  54. close SALIDA;
  55.  
  56. sub procesar_secuencia {
  57.     my ($nombre, $secuencia) = @_;
  58.  
  59.     #print "$nombre => $secuencia\n";
  60.     print SALIDA ">$nombre\n$secuencia";
  61. }
  62.  
  63. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Los errores que había:
  • la última marca es '__END__', y no '_END_'
  • en procesar_secuencia() estabas imprimiendo todas las secuencias, de forma repetida, cada vez que se terminaba de leer una de ellas, por efecto del foreach()
Última edición por explorer el 2013-05-13 09:22 @432, editado 1 vez en total
Razón: Colocación de los close en el lugar correcto
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema sobre utilidades de Perl y BioPerl

Notapor Alfumao » 2013-05-13 08:27 @394

En realidad el código me da problemas al utilizarlo como subrutina. Parece que coge bien los archivos y los abre, pero no me da resultados, mientras que si uso esa lista y el FASTA tanto con tu código de la respuesta anterior como con un CGI donde tengo implementado ese script, me funcionan... pero no veo la diferencia con la subrutina (que tampoco me da error al utilizarla...).

Aquí te la mando por si tú ves lo que yo no.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub SEQRET {
  2.  
  3.     my ( $lista, $file, $count ) = @_;
  4.  
  5.     my %es_interesante;
  6.     $count++;
  7.  
  8.     print "lista $lista and FASTA $file and count $count\n";
  9.  
  10.     open( SEQ, "$lista" ) or die("ERROR: Unable to open list for SEQRET $!\n");
  11.  
  12.     while ( my $linea = <SEQ> ) {
  13.         chomp $linea;
  14.         $es_interesante{$linea} = 1;   # la almacenamos en la memoria asociativa
  15.     }
  16.     close SEQ;
  17.  
  18.     # Lectura del fichero FASTA
  19.     my $nombre_secuencia;              # Guarda el nombre de cada secuencia
  20.     my $secuencia = '';                # Contenido de la secuencia interesante
  21.  
  22.     open FASTA, '<' . "$file" or die "ERROR: Unable to open FASTA for SEQRET $!\n";
  23.     open SALIDA, '>>' . "$file.Sequences.$count.txt" or die "ERROR: Unable to open OUTFILE $!\n";
  24.  
  25.     while ( my $linea = <FASTA> ) {
  26.  
  27.         if ( $linea =~ /^>(\w+)/ ) {   # Comienzo de una secuencia nueva
  28.  
  29.             if ($secuencia) {          # Si tenemos una ya leída...
  30.                 procesar_secuencia( $nombre_secuencia, $secuencia );    # la procesamos
  31.             }
  32.  
  33.             $nombre_secuencia = $1;    # Nombre de la secuencia extraída desde la exp. reg.
  34.             $secuencia        = '';    # Reiniciamos nuestra secuencia a capturar
  35.  
  36.             next;                      # pasamos a la siguiente línea
  37.         }
  38.  
  39.         if ( $es_interesante{$nombre_secuencia} ) {    # Si estamos en una secuencia interesante
  40.             $secuencia .= $linea;      # la capturamos
  41.         }
  42.     }
  43.  
  44.     close FASTA;
  45.     close SALIDA;
  46.  
  47.     if ($secuencia) {                  # Si aún queda alguna $secuencia por sacar
  48.         procesar_secuencia( $nombre_secuencia, $secuencia );    # la procesamos
  49.     }
  50.  
  51.     sub procesar_secuencia {
  52.  
  53.         my ( $nombre, $secuencia ) = @_;
  54.         print SALIDA ">$nombre\n$secuencia";
  55.         print ">$nombre\n$secuencia";
  56.     }
  57. }
  58.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El error con el que comenzó todo esto se acabó al arreglar los finales de línea, pero ahora no funciona la subrutina y no sé por qué será (seguramente al modificar cosas probando para quitar errores he hecho algo mal...) :?
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Problema sobre utilidades de Perl y BioPerl

Notapor explorer » 2013-05-13 10:16 @469

Yo no veo fallos, salvo que los close() deben realizarse después de la línea 48, ya que procesar_secuencia necesita que SALIDA siga abierto.

Bueno... quizás si hay un problema: procesar_secuencia necesita de la existencia de SALIDA, pero quizás, al trabajar dentro de una subrutina, no sabe de dónde viene.

Esta es una solución más compacta y que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my ( $lista, $archivo, $count ) = ( 'seq.txt', 'code_34614.fasta', 0 );
  7.  
  8. SEQRET( $lista, $archivo, $count );
  9.  
  10. sub SEQRET {
  11.     my ( $lista, $archivo, $count ) = @_;
  12.  
  13.     $count++;
  14.  
  15.     ## Variables
  16.     my $SEQ;                           # Gestor del archivo con la lista
  17.     my $FASTA;                         # Gestor del archivo FASTA
  18.     my $SALIDA;                        # Gestor del archivo de salida
  19.  
  20.     ## Lectura de la lista de secuencias
  21.     if ( not open $SEQ, $lista ) {                     # Si no hay listado
  22.         warn "ERROR al leer $lista: $!\n";             # salimos con aviso de error
  23.         return;
  24.     }
  25.  
  26.     # Recordamos qué secuencias nos interesan
  27.     my %es_interesante = map { chomp; $_ => '' } readline $SEQ;
  28.  
  29.     close $SEQ;
  30.  
  31.     ## Lectura del archivo FASTA
  32.     if ( not open $FASTA, $archivo ) {                 # Si no podemos leer el archivo
  33.         warn "ERROR al leer $archivo: $!\n";           # salimos con aviso de error
  34.         return;
  35.     }
  36.  
  37.     my $nombre_secuencia;              # Guarda el nombre de cada secuencia
  38.     my $secuencia;                     # Contenido de la secuencia que vamos leyendo
  39.  
  40.     while ( my $linea = readline $FASTA ) {
  41.  
  42.         if ( $linea =~ /^>(\w+)/ or eof $FASTA ) {     # Comienzo de una secuencia nueva o fin de archivo
  43.  
  44.             if ($secuencia) {                          # Si teníamos una secuencia leída...
  45.                 $secuencia .= $linea if eof $FASTA;    # Agregamos la última línea en caso de fin de archivo
  46.                 $es_interesante{$nombre_secuencia}     # La guardamos
  47.                     = $secuencia;
  48.             }
  49.  
  50.             if ($1) {                                  # Si es inicio de secuencia...
  51.                 $nombre_secuencia = $1;                # Nombre de la secuencia extraída desde la exp. reg.
  52.                 $secuencia        = '';                # Reiniciamos nuestra secuencia a capturar
  53.                 next;                                  # pasamos a la siguiente línea del archivo FASTA
  54.             }
  55.         }
  56.         else {
  57.             if ( exists $es_interesante{$nombre_secuencia} ) {    # Si es de en una secuencia interesante...
  58.                 $secuencia .= $linea;                             # la guardamos
  59.             }
  60.         }
  61.     }
  62.  
  63.     close $FASTA;
  64.  
  65.     ## Salida de las secuencias
  66.     if ( not open $SALIDA, '>>' . "$archivo.Sequences.$count.txt" ) {
  67.         warn "ERROR: No puedo escribir en [$archivo.Sequences.$count.txt]: $!\n";
  68.         return;
  69.     }
  70.  
  71.     foreach my $seq ( sort keys %es_interesante ) {    # Sacamos todas las secuencias, ordenadas alfabéticamente
  72.         print $SALIDA '>', $seq, "\n", $es_interesante{$seq};
  73.     }
  74.  
  75.     close $SALIDA;
  76. }
  77.  
  78. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema sobre utilidades de Perl y BioPerl

Notapor Alfumao » 2013-05-14 03:49 @200

He conseguido hacer funcionar la subrutina, el problema no estaba en ella (la saqué del programa en que estaba incluida e hice un script individual con ella, comprobando que funcionaba). El problema es que los programas anteriores no son capaces de escribir sus salidas lo bastante rápido como para que la subrutina los pueda usar como entrada, por lo que lee una lista de genes vacía y por lo tanto devuelve un FASTA vacío.

Ahora viene la siguiente pregunta, ¿hay alguna fórmula para hacer esperar un poco la ejecución de partes del código y que así a los programas anteriores les dé tiempo a escribir sus resultados...?

Creo que usaré la función sleep, a ver si consigo mi objetivo. :wink:
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

AnteriorSiguiente

Volver a Bioinformática

¿Quién está conectado?

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

cron