Освежающий оператор чтения строк Perl


Что происходит после достижения eof оператором в perl?

Я читаю INP1 строка за строкой с

while(<INP1>) {
}

Но мне нужно сделать это чтение несколько раз, и мне нужно начинать с начала файла каждый раз. Как я могу это сделать? Есть ли что-то вроде освежающего потока в perl?

Заранее благодарю.

3 3

3 ответа:

Если INP1 подключен к обычному файловому манипулятору (а не к ручке сокета или трубе), вы также можетеseek вернемся к началу файла.

while(<INP1>) {
   ...
}
seek INP1, 0, 0;

# do it again
while (<INP1>) {
   ...
}

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

open INP1, '<', $the_file;
@INP1 = <INP1>;
close INP1;

foreach (@INP1) {
   ...
}

# do it again
foreach (@INP1) {
   ...
}

В дополнение к использованию seek для возврата к началу файла, вы можете использовать Tie::File для обработки файла как массива строк. В зависимости от вашего шаблона доступа, это может быть более эффективным, чем повторное чтение файла с самого начала каждый раз.

Вы можете seek вернуться к началу:

use Fcntl;
open INP1, ...
while (<INP1>) {
}
seek INP1, 0, SEEK_SET;
while (<INP1>) {
}

Это будет работать правильно только в том случае, если INP1 является реальным файлом (не каналом или сокетом).