[perl] =?ISO-8859-1?Q?Re=3A_=5Bperl=5D_Por_qu=E9_no_vaaaaaaaaaaaaaaaaa?= =?ISO-8859-1?Q?aaaa?=

Salvador Ortiz Garcia sog@msg.com.mx
Thu, 19 Nov 1998 18:36:24 -0600 (EST)


On Thu, 19 Nov 1998, Jose Ignacio wrote:

> Hola de nuevo. Lo que quiero es leer y escribir ?¿?¿ y lo hago en otros
> programas pero no a la vez y funciona, pero aquí lo que quiero es leer -
> modificar lo que leo - y escribirlo
> Gracias

Creo que la gente se confundió un poco.

Primero:

En perl efectivamente se usa '+<' para abrir el archivo en modo
read/write ('>+' tambien es read/write pero limpia el archivo si existe)

Segundo:

En perl (como en C) no se pueden revolver reads y writes sin avisarle al
sistema mediante un seek (fseek en C), es decir, si acabas de leer y
quieres escribir necesitas mover el 'file pointer' antes de escribir y
visceversa, aunque ese "mover" sea nulo.

Entonces en tu caso, si vienes leyendo y quieres modificar el último
registro leído, necesitas mover hacia atras el 'file pointer' antes de
escribir la modificación:

...
while(<FILE>) {
	...
	if(ESE_DATO_SE_MODIFICA) {
		$dato = modifica($_);
		seek(FILE,1,-$long_de_tu_registro);
		print FILE $dato;
		seek(FILE,1,0);
	}
	...
}
...

El 'seek(FILE,1,0)' "mueve" el apuntador *cero* bytes apartir de la
posición actual (al final de lo que escribiste), pero satisface la regla
enunciada más arriba y te permite que la siguiente operación sea de
lectura.

Ahora, nota que ese tipo de operaciones asume que todos tus registros
(lease líneas) son de la misma longitud, en caso contrario el archivo se
te va a batir. En el código de arriba $long_de_tu_registro resulta ser una
constante.

Si tu archivo tiene registros de longitud variable, el método correcto es
el que te recomendaron de usar un archivo temporal. 

Saludos

Salvador Ortiz

--------------------------------------------------------------------------
Matias Software Group                                  (525) 256-0214
Soporte comercial para Linux y Apache en Mexico         info@msg.com.mx
--------------------------------------------------------------------------


--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : cancelacion perl