Повторное чтение из уже прочитанного дескриптора файла

Я открыл файл для чтения построчно:

open(FH,"<","$myfile") or die "could not open $myfile: $!";
while (<FH>)
{
    # ...do something
}

Позже в программе я пытаюсь перечитать файл (пройтись по файлу еще раз):

while (<FH>)
{
    # ...do something
}

и понял, что это как если бы элемент управления в файле находился в EOF и не будет повторяться с первой строки в файле .... это поведение по умолчанию? Как обойти это? Файл большой, и я не хочу хранить его в памяти как массив. Итак, мой единственный вариант - закрыть и снова открыть файл?


person rajeev    schedule 20.08.2012    source источник


Ответы (2)


Используйте поиск для перемотки назад к началу файла:

seek FH, 0, 0;

Или, если быть более подробным:

use Fcntl;
seek FH, 0, SEEK_SET;

Обратите внимание, что это значительно ограничивает полезность вашего инструмента, если вы должны искать на входе, поскольку его никогда нельзя использовать в качестве фильтра. Чрезвычайно полезно уметь читать из конвейера, и вы должны стремиться организовать свою программу так, чтобы поиск не был необходим.

person William Pursell    schedule 20.08.2012

У вас есть несколько вариантов.

  • Снова открыть дескриптор файла
  • Установите позицию в начало файла, используя seek, как предложил Уильям Перселл.
  • Используйте модуль, такой как Tie::File, который позволяет читать файл как массив, не загружая его в память.
person TLP    schedule 20.08.2012
comment
относительно Tie::File я заметил комментарий (потерянная ссылка) о BerkeleyDB на stackoverflow - в контексте чтения очень больших файлов, не помещая их сразу в ОЗУ. я чувствовал, на данный момент искать достаточно. еще раз спасибо! - person rajeev; 20.08.2012
comment
@rajeev Это очень хороший модуль, и он является частью основной установки версии 5.7.3. Я бы сказал, что стандартным решением было бы просто повторно открыть дескриптор файла. Вам даже не нужно сначала закрывать дескриптор файла, так как это делается автоматически. - person TLP; 20.08.2012