2010-11-23 3 views
2

Что происходит после достижения уровня с помощью <> Оператор в perl?Оператор считывания строки чтения Perl

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

while(<INP1>) { 
} 

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

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

ответ

8

Если 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

`использовать autodie;` ⁠ – tchrist 2010-11-24 01:38:28

+2

использования лексического контекстные – planetp 2010-11-24 20:41:10

2

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

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

Это будет работать только если INP1 реальный файл (не труба или розетка).

3

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

Смежные вопросы