Обновление оператора чтения строк Perl - PullRequest
3 голосов
/ 24 ноября 2010

что происходит после достижения eof с помощью оператора <> в perl?

Я читаю INP1 построчно с

while(<INP1>) {
}

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

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 24 ноября 2010

Если 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) {
   ...
}
3 голосов
/ 24 ноября 2010

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

2 голосов
/ 24 ноября 2010

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

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

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

...