• Publicidad

Manejo de archivos

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Manejo de archivos

Notapor szenteno » 2010-07-28 18:20 @806

Hola:

El problema que tengo es que no sé por qué razón el programa no entra al while() que lee un archivo de texto.

Mi código es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @titulo;
  2. for(my $t=0; $t<$close;$t++){
  3.         my $destructinador=$outputs_R[$t];
  4.         next if ! -f $destructinador;
  5.         my $armainador=$nombres_R[$t];
  6.         open(DERECHO, "$destructinador")|| die "Error al abrir DERECHO $destructinador: $!\n \n";
  7.         open(IZQUIERDO, "$opts{o}/$armainador")|| die "Error al abrir IZQUIERDO $armainador: $!\n \n";
  8.         open(COMPLETO, ">$opts{o}/$armainador")|| die "Error al abrir COMPLETO $armainador: $!\n \n";
  9.         my $w=0;
  10.         while(<DERECHO>){      
  11.                 chomp; 
  12.                 my $termino=substr($_, 0, 1);
  13.                 if($termino=~'>'){
  14.                         $titulo[$w]=substr($_, 0, 18);
  15.                         $w++;
  16.                         }
  17.                 }      
  18.         close(DERECHO);
  19.         my $aviso=0;
  20.         my $far=scalar(@titulo);
  21.         my $foto;
  22.         while(<IZQUIERDO>){
  23.                 print "\nIZQUIERDO\n";
  24.                 chomp;
  25.                 START:
  26.                 for(my $q=0;$q<$far;$q++){
  27.                         if((substr($_, 0, 18)) eq $titulo[$q]){
  28.                                 $foto=substr($_, 0, 18);
  29.                                 $aviso=1;
  30.                                 next;
  31.                                 }
  32.                         }
  33.                 if($aviso==0){
  34.                         print COMPLETO "$_\n";
  35.                         }
  36.                 if($aviso==1){
  37.                         while(<DERECHO>){
  38.                                 }
  39.                         $aviso=2;
  40.                         }
  41.                 if($aviso==2){
  42.                         my $sustrato=substr($_, 0, 1);
  43.                         if($sustrato=~'>'){
  44.                                 $aviso=3;
  45.                                 }
  46.                         }
  47.                 if($aviso==3){
  48.                         $aviso=0;
  49.                         goto START;
  50.                         }
  51.                 }
  52.         close(IZQUIERDO);
  53.         open(DERECHO, "$destructinador")|| die "Error al abrir DERECHO $destructinador: $!\n \n";
  54.         while(<DERECHO>){      
  55.                 chomp;
  56.                 print COMPLETO "$_\n";
  57.                 }
  58.         close(DERECHO);
  59.         close(COMPLETO);
  60.         }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pero a la hora de correrlo no entra al while() de IZQUIERDO; lo sé, porque además de que no hace lo que debe de hacer, no imprime la palabra "IZQUIERDO" en la pantalla.

Espero me puedan ayudar. Si necesitan más detalles pregúntenme.

P.D. Tampoco me indica algún error al abrir IZQUIERDO.
szenteno
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-04-27 11:09 @506

Publicidad

Re: Manejo de archivos

Notapor explorer » 2010-07-28 22:18 @971

El problema está en la línea 8.

Mientras estás abriendo el fichero en modo lectura, en la línea 7, en la línea siguiente lo abres en modo escritura.

Según el manual de open(), dice:
Si MODO es '>' , el fichero es truncado y abierto para salida, siendo creado si es necesario.

Así que la línea 8 pone a cero el contenido del fichero que abriste en la línea anterior. Por esa razón nunca entrará en el bucle de lectura: no tiene nada qué leer.

Además, en las líneas 13 y 43, pones
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($termino =~ '>') {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y me parece que así no se ponen las expresiones regulares. Mejor así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($termino =~ />/) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($termino =~ m'>') {
Coloreado en 0.001 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejo de archivos

Notapor szenteno » 2010-07-29 14:46 @657

Ok, ya vi lo que pasa. Es que yo quería que se creara un archivo con el mismo nombre para que lo sustituyera, pero por lo visto voy a tener que crear un intermediario, y sí, tiene mucho sentido, no sé por qué no lo noté antes.

Pero ya lo arreglé y ya funciona.

Muchas gracias, y checaré el capítulo de expresiones regulares, es que a la hora de escribirlo, lo saqué de mi memoria y no me acordaba bien cómo iba.

Saludos.
szenteno
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-04-27 11:09 @506

Re: Manejo de archivos

Notapor explorer » 2010-07-29 14:58 @665

No he visto el código en profundidad, pero si tienes memoria suficiente, puedes guardar el resultado en una variable escalar o array, y cuando se termine de procesar el fichero de entrada, pues lo abres en escritura y vuelcas el resultado.
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


Volver a Intermedio

¿Quién está conectado?

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