Recherche…


Lecture de fichiers: foreach vs. while

Lors de la lecture d' un fichier potentiellement important, un while boucle a un avantage de mémoire importante sur foreach . Ce qui suit lira l’enregistrement de fichier par enregistrement (par défaut, "record" signifie "une ligne", comme spécifié par $/ ), en attribuant chacun à $_ tel qu’il est lu:

while(<$fh>) {
    print;
}

L' opérateur de diamant fait de la magie ici pour s'assurer que la boucle ne se termine qu'à la fin du fichier et non par exemple sur les lignes contenant uniquement un caractère "0".

La boucle suivante semble fonctionner de la même manière, mais elle évalue l'opérateur de diamant dans un contexte de liste, ce qui entraîne la lecture complète du fichier:

foreach(<$fh>) {
    print;
}

Si vous utilisez de toute façon un enregistrement à la fois, cela peut entraîner un énorme gaspillage de mémoire et doit donc être évité.

Traitement de longues listes

Si vous avez déjà une liste en mémoire, le moyen le plus simple et le plus simple de le traiter est une simple boucle foreach :

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

Cela convient bien, par exemple, au traitement courant de $item et à son écriture dans un fichier sans conserver les données. Toutefois, si vous construisez une autre structure de données à partir des éléments, une while boucle est plus efficace mémoire:

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

À moins qu'une référence à $item se retrouve directement dans votre liste de résultats, les éléments que vous avez décalés du tableau @items peuvent être libérés et la mémoire réutilisée par l'interpréteur lorsque vous entrez dans la prochaine itération de la boucle.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow