Suche…


Dateien lesen: foreach vs. while

Beim Lesen einer möglicherweise großen Datei hat eine while Schleife einen erheblichen Speichervorteil gegenüber foreach . Das Folgende liest die Datei nach Datensatz (standardmäßig bedeutet "Datensatz" "eine Zeile", wie in $/ ), wobei jeder von ihnen beim Lesen $_ zugewiesen wird:

while(<$fh>) {
    print;
}

Der Diamantoperator mag hier etwas Magie, um sicherzustellen, dass die Schleife nur am Ende der Datei endet und nicht z. B. in Zeilen, die nur ein "0" -Zeichen enthalten.

Die folgende Schleife scheint genauso zu funktionieren, wertet jedoch den Diamantenoperator im Listenkontext aus, wodurch die gesamte Datei auf einmal gelesen wird:

foreach(<$fh>) {
    print;
}

Wenn Sie sowieso immer nur einen Datensatz verwenden, kann dies zu einer großen Speicherverschwendung führen und sollte daher vermieden werden.

Lange Listen bearbeiten

Wenn Sie bereits eine Liste im Speicher haben, ist die einfache und meist ausreichend zu verarbeitende Methode eine einfache foreach Schleife:

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

Dies ist z. B. für den üblichen Fall gut, wenn einige Verarbeitungen für $item und dann in eine Datei geschrieben werden, ohne dass die Daten erhalten bleiben. Wenn Sie jedoch aus den Elementen eine andere Datenstruktur aufbauen, ist eine while Schleife speichereffizienter:

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

Wenn ein Verweis auf $item direkt in der Ergebnisliste @items wird, können Elemente, die Sie aus dem @items Array verschoben haben, @items werden, und der Speicher kann vom Interpreter bei der nächsten @items der Schleife erneut verwendet werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow