[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