Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Resulta que tengo unas utilidades web que funcionan en Windows a las mil maravillas, pero resulta que el hosting que me dan es en Linux y he tenido que adaptar los cgi.
Después de romperme la cabeza con los permisos y demás requerimientos de Linux (con tanta parafernalia para hacer tan pocas cosas que en Windows se hacen con un clic, es desesperante trabajar con Linux, al menos hasta ahora) ahora resulta que hay varios programas clave que no funcionan (unos por la dificultad de hacerlos correr en Linux, donde solo hay medio millón de pegas al instalarlos y otros porque ahora funcionan diferente, el mismo programa funciona bien en Windows y mal en Linux...).
No entiendo cómo un script de Perl (en cgi) puede hacer su función completa (recuperar secuencias de un archivo FASTA y escribirlas en un fichero de texto) en Windows, y en Linux solo escribir la última (aparentemente las sobre-escribe y deja solo la última en vez de añadirlas todas, y no es porque haya cambiado el modo de escritura en el archivo de salida (es decir que la salida se abre en modo escribir y añadir ">>").
Básicamente el núcleo del programa es este (modificado de un diseño del propio explorer, con algunos añadidos para convertirlo en cgi) lo pongo con los comentarios que explorer hizo en su día en el programa.
Using perl Syntax Highlighting
- my $target1 = param('lista');
- my $target2 = param('FASTA');
- ############UNTAINTING###################
- for ( $target1, $target2 ) {
- if (/^([-\@\w.]+)$/) {
- $_ = $1;
- }
- else {
- die "Bad data in '$_'";
- }
- }
- ##################SUBIDA 1####################################
- my $lista = "$^T" . "$target1";
- my $lightweight_fh;
- my $io_handle;
- my $bytesread;
- $lightweight_fh = upload('lista');
- if ( defined $lightweight_fh ) {
- $io_handle = $lightweight_fh->handle;
- open( OUTFILE1, '>>' . "/opt/lampp/htdocs/DB/Uploads/$lista" );
- binmode(OUTFILE1);
- chmod( 0666, "/opt/lampp/htdocs/DB/Uploads/$lista" );
- while ( $bytesread = $io_handle->read( my $buffer, 2048 ) ) {
- print OUTFILE1 $buffer;
- }
- close OUTFILE1;
- }
- ##################SUBIDA 2####################################
- my $FASTA = "$^T" . "$target2";
- my $lightweight_fh2;
- my $io_handle2;
- my $bytesread2;
- $lightweight_fh2 = upload('FASTA');
- if ( defined $lightweight_fh2 ) {
- $io_handle2 = $lightweight_fh2->handle;
- open( OUTFILE2, '>>' . "/opt/lampp/htdocs/DB/Uploads/$FASTA" );
- binmode(OUTFILE2);
- chmod( 0666, "/opt/lampp/htdocs/DB/Uploads/$FASTA" );
- while ( $bytesread2 = $io_handle2->read( my $buffer, 2048 ) ) {
- print OUTFILE2 $buffer;
- }
- close OUTFILE2;
- }
- ##################FIN SUBIDAS####################################
- my $upload1 = "Uploads/$lista";
- my $upload2 = "Uploads/$FASTA";
- my %es_interesante;
- open( INFILE, "$upload1" ) or die("Can't open list ERROR: $!\n");
- while ( my $linea = <INFILE> ) {
- chomp $linea;
- $es_interesante{$linea} = 1; # la almacenamos en la memoria asociativa
- } #Creamos un hash con las lineas=Headers como keys
- close INFILE;
- # Lectura del fichero FASTA
- my $nombre_secuencia; # Guarda el nombre de cada secuencia
- my $secuencia = ''; # Contenido de la secuencia interesante
- #Abrir salida
- open SALIDA, '>>' . "/opt/lampp/htdocs/DB/Results/Extracted_$FASTA.txt" or die "ERROR: $!\n";
- chmod( 0666, "/opt/lampp/htdocs/DB/Results/Extracted_$FASTA.txt" );
- #Abrir secuencias FASTA DB
- open( FASTA, '<' . "$upload2" ) or die("Can't open FASTA ERROR: $!\n");
- while ( my $linea = <FASTA> ) {
- if ( $linea =~ /^>(\w+)/ ) { # Comienzo de una secuencia nueva
- if ($secuencia) { # Si tenemos una ya leída...
- procesar_secuencia( $nombre_secuencia, $secuencia ); # la procesamos
- }
- $nombre_secuencia = $1; # Nombre de la secuencia extraída desde la exp. reg.
- $secuencia = ''; # Reiniciamos nuestra secuencia a capturar
- next; # pasamos a la siguiente línea
- }
- if ( $es_interesante{$nombre_secuencia} ) { # Si estamos en una secuencia interesante
- $secuencia .= $linea; # la guardamos
- }
- }
- close FASTA;
- close SALIDA;
- if ($secuencia) { # Si aún queda alguna $secuencia por sacar
- procesar_secuencia( $nombre_secuencia, $secuencia ); # la procesamos
- }
- sub procesar_secuencia {
- my ( $nombre, $secuencia ) = @_;
- print "<br><b>>$nombre</b>\n<br>";
- print "$secuencia\n";
- print SALIDA ">$nombre \n";
- print SALIDA "$secuencia\n";
- }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
¿Alguien me puede explicar por qué sobre-escribe el fichero salida y devuelve solo la última secuencia de la lista buscada, en vez de añadir cada secuencia nueva que encuentra y devolver todas las de la lista?
Gracias por vuestra atención.
PD. Sigo sin poder usar la tilde en Linux...