Buscar..


Lectura de archivos: foreach vs. while

Cuando se lee un archivo potencialmente grande, un while de bucle tiene una ventaja significativa sobre la memoria foreach . Lo siguiente leerá el registro del archivo por registro (de manera predeterminada, "registro" significa "una línea", según lo especificado en $/ ), asignando cada uno a $_ medida que se lee:

while(<$fh>) {
    print;
}

El operador Diamond hace algo de magia aquí para asegurarse de que el bucle solo finalice al final del archivo y no, por ejemplo, en líneas que contengan solo un carácter "0".

El siguiente bucle parece funcionar igual, sin embargo, evalúa el operador Diamond en el contexto de la lista, lo que hace que todo el archivo se lea de una sola vez:

foreach(<$fh>) {
    print;
}

De todos modos, si está operando en un registro a la vez, esto puede resultar en una gran pérdida de memoria y, por lo tanto, debe evitarse.

Procesando listas largas

Si ya tiene una lista en la memoria, la forma sencilla y generalmente suficiente de procesarla es mediante un simple bucle foreach :

foreach my $item (@items) {
    ...
}

Esto está bien, por ejemplo, para el caso común de realizar un procesamiento en $item y luego escribirlo en un archivo sin mantener la información. Sin embargo, si usted acumula alguna otra estructura de datos de los artículos, un while de bucle es más eficiente de la memoria:

my @result;
while(@items) {
    my $item = shift @items;
    push @result, process_item($item);
}

A menos que una referencia a $item termine directamente en su lista de resultados, los elementos que eliminó de la matriz @items se pueden liberar y el intérprete puede reutilizar la memoria cuando ingresa a la siguiente iteración de bucle.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow