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í:
Using perl Syntax Highlighting
#!/usr/bin/perl
open IN, "+<D:/etc/ticketsven.txt" or die "ERROR: No puedo abrir el archivo: $!\n";
seek IN, 0, 2;
while (1) {
print "introduzca datos [FIN para terminar] \n";
print "ingrese número de tique: ";
chomp( $numero = <STDIN> );
last if $numero eq 'FIN';
print "ingrese tipo de actividad: ";
chomp( $actividad = <STDIN> );
print IN "$numero:$actividad\n";
}
close IN;
print "INFORMACIÓN ARCHIVO DATOS.TXT EN MODO LECTURA \n";
print "=================================================================== \n";
open IN, "<D:/etc/ticketsven.txt" or die "ERROR: No puedo abrir el archivo: $!\n";
while ( $linea = <IN> ) {
( $numero, $snombre, $papellido, $sapellido ) = split( /:/, $linea, 20 );
print "Número de tique: " . $numero . " TIPO DE ACTIVIDAD: " . $actividad . "\n";
}
close IN;
Coloreado en 0.002 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