Повторное чтение из уже прочитанного 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, что позволяет читать файл как массив, не загружая его в память.