Поиск…


Чтение файлов: foreach и while

При чтении потенциально большой файл, будет в while цикл имеет значительное преимущество над памятью foreach . Следующее будет читать запись файла по записи (по умолчанию «запись» означает «строка», как указано в $/ ), присваивая каждому значение $_ мере чтения:

while(<$fh>) {
    print;
}

Алмазный оператор делает здесь немного волшебства, чтобы убедиться, что цикл завершается только в конце файла, а не на линиях, содержащих только символ «0».

Следующий цикл, похоже, работает одинаково, однако он оценивает оператора алмаза в контексте списка, заставляя весь файл читать за один раз:

foreach(<$fh>) {
    print;
}

Если вы работаете в одной записи одновременно, это может привести к огромной трате памяти, и поэтому ее следует избегать.

Обработка длинных списков

Если у вас уже есть список в памяти, простой и обычно достаточный способ его обработки - простой цикл foreach :

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

Это нормально, например, для обычного случая выполнения некоторой обработки на $item а затем записывать его в файл без сохранения данных. Тем не менее, если вы строите некоторые другую структуру данных из элементов, в while цикл меньше памяти:

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

Если ссылка на $item напрямую не попадает в ваш список результатов, элементы, которые вы @items массивом @items могут быть освобождены, а память будет повторно использована интерпретатором при вводе следующей итерации цикла.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow