Ricerca…


Lettura dei file: foreach vs. while

Durante la lettura di un file potenzialmente grande, un ciclo while ha un vantaggio significativo sulla memoria rispetto a foreach . Quanto segue leggerà il record del file per record (per impostazione predefinita, "record" significa "una riga", come specificato da $/ ), assegnando ciascuno a $_ come viene letto:

while(<$fh>) {
    print;
}

L' operatore diamante fa un po 'di magia qui per assicurarsi che il ciclo si fermi solo alla fine del file e non per esempio sulle linee che contengono solo un carattere "0".

Il seguente ciclo sembra funzionare lo stesso, tuttavia valuta l'operatore di diamante nel contesto dell'elenco, provocando la lettura dell'intero file in una volta sola:

foreach(<$fh>) {
    print;
}

Se si opera comunque su un disco alla volta, ciò può comportare un enorme spreco di memoria e dovrebbe quindi essere evitato.

Elaborazione di lunghi elenchi

Se si dispone già di un elenco in memoria, il modo semplice e generalmente sufficiente per elaborarlo è un semplice ciclo foreach :

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

Questo va bene, ad esempio per il caso comune di fare qualche elaborazione su $item e poi scriverlo su un file senza mantenere i dati in giro. Tuttavia, se crei un'altra struttura dati dagli elementi, un ciclo while è più efficiente in termini di memoria:

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

A meno che un riferimento a $item finisca direttamente nell'elenco dei risultati, gli oggetti che hai spostato dall'array @items possono essere liberati e la memoria riutilizzata dall'interprete quando inserisci l'iterazione del ciclo successivo.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow