Повторное чтение из уже прочитанного filehandle

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

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

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

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

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

2 ответов


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

seek FH, 0, 0;

или, будучи более подробным:

use Fcntl;
seek FH, 0, SEEK_SET;

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


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

  • открыть дескриптор файла
  • установите положение в начало файла с помощью искать, как предложил Уильям Перселл.
  • используйте модуль, такой как Tie:: File, что позволяет читать файл как массив, не загружая его в память.