Szukaj…


Czytanie plików: foreach vs. while

Podczas czytania potencjalnie dużego pliku, A while pętla ma znaczną przewagę nad pamięci foreach . Następujące pliki będą czytać rekord pliku według rekordów (domyślnie „rekord” oznacza „linię” określoną przez $/ ), przypisując każdemu do $_ podczas odczytu:

while(<$fh>) {
    print;
}

Operator diamentów robi tutaj trochę magii, aby upewnić się, że pętla kończy się tylko na końcu pliku, a nie np. W wierszach zawierających tylko znak „0”.

Następująca pętla wydaje się działać tak samo, jednak ocenia operatora diamentu w kontekście listy, powodując, że cały plik jest odczytywany za jednym razem:

foreach(<$fh>) {
    print;
}

Jeśli i tak korzystasz z jednego rekordu na raz, może to spowodować ogromne marnowanie pamięci i dlatego należy tego unikać.

Przetwarzanie długich list

Jeśli masz już listę w pamięci, prostym i zwykle wystarczającym sposobem jej przetworzenia jest prosta pętla foreach :

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

Jest to w porządku, np. W typowym przypadku przetwarzania jakiegoś $item a następnie zapisywania go do pliku bez przechowywania danych. Jednak, jeśli można zbudować jakąś inną strukturę danych z pozycji, A while pętla jest bardziej wydajna pamięć:

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

O ile odniesienie do $item bezpośrednio na liście wyników, elementy, które przesunąłeś z tablicy @items mogą zostać zwolnione, a pamięć ponownie wykorzystana przez interpreter po przejściu do iteracji następnej pętli.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow