Sök…


Läser filer: förut mot medan

När du läser en potentiellt stor fil, en while har loop en betydande minne fördel gentemot foreach . Följande kommer att läsa filposten efter post (som standard betyder "post" "en rad", som anges av $/ ), och tilldelar var och en till $_ som den är läst:

while(<$fh>) {
    print;
}

Diamantoperatören gör lite magi här för att se till att slingan endast avslutas i slutet av filen och inte t.ex. på linjer som bara innehåller ett "0" -tecken.

Följande slinga verkar fungera precis på samma sätt, men utvärderar diamantoperatören i listkontext, vilket gör att hela filen läses på en gång:

foreach(<$fh>) {
    print;
}

Om du ändå arbetar med en post åt gången kan detta resultera i ett enormt slöseri med minnet och bör därför undvikas.

Bearbetar långa listor

Om du redan har en lista i minnet är det enkla och vanligtvis tillräckliga sättet att bearbeta den en enkel foreach :

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

Det här är bra, t.ex. för det vanliga fallet att göra en del bearbetning på $item och sedan skriva ut den till en fil utan att hålla informationen kvar. Men om du bygger upp en annan datastruktur från föremålen, en while slinga är mer minne effektiv:

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

Såvida inte en hänvisning till $item hamnar direkt i din resultatlista, kan objekt som du skiftade från @items array frigöras och minnet återanvändas av tolkar när du går in i nästa loop-iteration.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow