[perl] Re: [perl] Por qué no vaaaaaaaaaaaaaaaaa aaaa

Jose Ignacio jopinet@writeme.com
Fri, 20 Nov 1998 09:54:31 +0100


CORRECTO, mi duda estaba en si las líneas o lo que quiero sobreescribir
es de longitud distinta. Y veo que no hay resultado correcto con este
método ;-((
Se trataba de depurar un programa con una cantidad de accesos grandísima
, y tratar de usar un archivo temporal (o matriz temporal en mi caso), y
leer-modificar-escribirlo modificado   de una tirada , pero al cambiar
los campos de longitud, no hay forma.

Gracias
Jose Ignacio
http://www.jopinet.com


Salvador Ortiz Garcia escribió:
> 
> 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
--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : cancelacion perl