Estoy tratando de escribir un fragmento de código que lea un archivo línea por línea y almacene cada línea, hasta una cierta cantidad de datos de entrada. Quiero protegerme de que el usuario final sea malvado y poner algo así como una serie de datos en una línea, además de protegerme contra la succión de un archivo anormalmente grande. Haciendo $str = <FILE>
leerá en una línea completa, y eso podría ser muy largo y explotar mi memoria.En Perl, ¿puedo limitar la longitud de una línea cuando la leo desde un archivo (como fgets)?
fgets me permite hacer esto al permitirme especificar un número de bytes para leer durante cada llamada y, básicamente, me permite dividir una larga línea en mi longitud máxima. ¿Hay alguna manera similar de hacer esto en perl? Vi algo sobre sv_gets
pero no estoy seguro de cómo usarlo (aunque solo hice una búsqueda rápida en Google).
El objetivo de este ejercicio es evitar tener que realizar análisis/almacenamiento en búfer adicionales después de leer los datos. fgets se detiene después de N bytes o cuando se alcanza una nueva línea.
EDIT Creo que confundí un poco. Quiero leer líneas X, cada una con una longitud máxima Y. No quiero leer más de Z bytes en total, y preferiría no leer todos los bytes Z a la vez. Creo que podría hacer eso y dividir las líneas, pero me pregunto si hay alguna otra manera. Si esa es la mejor manera, entonces usar la función de lectura y hacer un análisis manual es mi apuesta más fácil.
Gracias.
¿por qué preferiría no leer todos los bytes Z a la vez? ¿Estás buscando una función get_n_lines_or_max_bytes (fh, n, z)? Tal bestia no es muy difícil de escribir ... – geocar
Supongo que es solo cuestión de preferencia. Odio chupar megs de datos cuando puedo analizarlos de forma incremental. Además, ignoraré algunos datos también, entonces ¿por qué ocupar la memoria innecesaria al principio? Sin embargo, veo que es una solución para facilitar el mantenimiento/escritura. –
@SB: pruébelo. Encontrará que llamar a read() y split() usa menos memoria y se ejecuta más rápido que utilizando cualquiera de las implementaciones de fgets(). – geocar