2010-11-23 6 views
2

펄에서 <> 연산자를 사용하여 eof에 도달하면 어떻게됩니까?새로 고침 라인 읽기 연산자 Perl

나는

while(<INP1>) { 
} 

과 선으로 INP1 라인을 읽고 있어요하지만 난이 읽기를 여러 번 할 필요가 나는 파일마다의 처음부터 시작해야합니다. 어떻게해야합니까? 펄에서 스트림을 새로 고치는 것과 같은 것이 있습니까?

미리 감사드립니다.

답변

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

+2

사용 어휘 범위 파일 핸들을 – planetp

2

당신은 seek 처음부터 다시 할 수 있습니다 INP1 실제 파일 (하지 파이프 나 소켓) 인 경우

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

이는 제대로 작동합니다.

+5

나는 확실히이 프로그램은 사용 strict','사용 경고'을 QW,'사용 autodie', 하나 사용 '의 또 다른 맛'로 시작하는 희망 개방 QW <: std IO : utf8>','END {close STDOUT}', 그리고 명시적인'close INP1'을 포함합니다. 너도 알지? : – tchrist

+0

@tchrist : 좋은 제안이긴하지만, 질문에 대답하지 않아서 질문에 답할 수 없으므로 답안에 포함시키지 않을 것입니다. –

+1

@Adrian : 성공을 확인하지 않고 syscalls를 작성하는 것은 허용됩니다 어떤 상황입니까? – tchrist

3

seek을 사용하여 파일 시작 부분으로 돌아가는 것 외에도 Tie::File을 사용하여 파일을 줄 배열로 처리 할 수 ​​있습니다. 액세스 패턴에 따라 파일을 처음부터 다시 읽는 것보다 훨씬 효율적일 수 있습니다.

관련 문제