• Publicidad

Insertar archivos de variables

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Insertar archivos de variables

Notapor charlygarza » 2013-05-29 20:54 @912

Buenas. Tengo un problema. Lo que intento hacer es introducir varios datos a un archivo pero solo me aparece un dato.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. while (1) {                            # bucle infinito
  3.  
  4.     print "introduzca datos [FIN para terminar] \n";
  5.     print "ingrese número de tique: ";
  6.     chop( $numero = <STDIN> );
  7.     print "ingrese tipo de actividad: ";
  8.     chop( $actividad = <STDIN> );
  9.     open( IN, "+>D:/etc/ticketsven.txt" );
  10.     seek( IN, 0, 2 );
  11.     print IN "$numero:$actividad\n";
  12.     close IN;
  13.  
  14.     last if $numero eq 'FIN';
  15.  
  16. }
  17.  
  18. print "INFORMACIÓN ARCHIVO DATOS.TXT EN MODO LECTURA \n";
  19. print "=================================================================== \n";
  20. open( IN, "<D:/etc/ticketsven.txt" );
  21. while ( $linea = <IN> ) {
  22.     ( $numero, $snombre, $papellido, $sapellido ) = split( /:/, $linea, 20 );
  23.     print "Número de tique: " . $numero . "    TIPO DE ACTIVIDAD: " . $actividad . "\n";
  24. }
  25. close IN;
  26.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2013-05-30 05:35 @274, editado 3 veces en total
Razón: Formateado de código con Perltidy
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Publicidad

Re: Insertar archivos de variables

Notapor explorer » 2013-05-30 05:29 @270

El problema está en el uso de '+>'.

Según la documentación, el poner el '+' indica que queremos abrir el archivo en modo de lectura/escritura, pero con '>', además le estamos indicando que la primera operación que hacemos sobre el archivo es sobreescribirlo, así que lo que ocurre es que siempre lo ponemos a cero cada vez que lo abrimos.

Ejemplo:
Código: Seleccionar todo
> cat kk.txt
blablablabla
blablalba
Nombres: Pepe Manolo
balblabla
blablal
> perl -E 'open F, "+<kk.txt"; seek F, 0, 2; say F "Hola"; close F'; cat kk.txt
blablablabla
blablalba
Nombres: Pepe Manolo
balblabla
blablal
Hola
> perl -E 'open F, "+>kk.txt"; seek F, 0, 2; say F "Hola"; close F'; cat kk.txt
Hola

Por eso también dice que lo recomendable es usar siempre '+<'.

Para el caso que muestras, se puede simplificar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. open IN, "+<D:/etc/ticketsven.txt" or die "ERROR: No puedo abrir el archivo: $!\n";
  4. seek IN, 0, 2;
  5.  
  6. while (1) {
  7.  
  8.     print "introduzca datos [FIN para terminar] \n";
  9.     print "ingrese número de tique: ";
  10.     chomp( $numero = <STDIN> );
  11.  
  12.     last if $numero eq 'FIN';
  13.  
  14.     print "ingrese tipo de actividad: ";
  15.     chomp( $actividad = <STDIN> );
  16.  
  17.     print IN "$numero:$actividad\n";
  18. }
  19.  
  20. close IN;
  21.  
  22. print "INFORMACIÓN ARCHIVO DATOS.TXT EN MODO LECTURA \n";
  23. print "=================================================================== \n";
  24. open IN, "<D:/etc/ticketsven.txt" or die "ERROR: No puedo abrir el archivo: $!\n";
  25. while ( $linea = <IN> ) {
  26.     ( $numero, $snombre, $papellido, $sapellido ) = split( /:/, $linea, 20 );
  27.     print "Número de tique: " . $numero . "    TIPO DE ACTIVIDAD: " . $actividad . "\n";
  28. }
  29. close IN;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Cambios:
  • Sacamos el open(), seek() y close() fuera del bucle, y así, el programa solo tiene que ejecutarlos una vez
  • Comprobamos que el usuario ha introducido 'FIN' enseguida, para terminar el bucle cuanto antes, y no le hacemos una pregunta extra
  • usamos chomp() en lugar de chop(). Es más seguro, y hará que el programa funcione en otros sistemas operativos
  • agregamos die() a los open(). Siempre hay que avisar al usuario por si algo ha ido mal
  • la palabra ticket la hemos traducido por tique
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: Insertar archivos de variables

Notapor charlygarza » 2013-05-30 09:19 @430

Muchas gracias por tu respuesta.
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598


Volver a Básico

¿Quién está conectado?

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