2012-09-03 2 views
0

파일에 파일 핸들러가 있는데 줄에서 일치하는 항목을 찾고 새 줄과 일치하는 항목을 교체합니다. 서브 루틴에서 행 교체가 발생합니다.파일의 한 줄을 바꾸면 그 아래 줄이 바뀝니다. Perl

sub replace{ 
    seek(FILE,0,0); 
    while(my $line= <FILE>){ 
     if($line =~ m/SOMEMATCH/){ 
      $line=~ s/SOMEMATCH/REPLACEMENT/; 
      print FILE $line; 
     } 
    } 
} 

내가 & 내가 잘못 라인이 너무 변경된 것을 발견 대체 호출 한 후 파일을 인쇄 할 때 :

Line 1 
Line 2 
Line 3 
SOMEMATCH 
Line 4 
Line 5 

이된다 : 무슨 일이야

Line 1 
Line 2 
Line 3 
SOMEMATCH 
REPLACEMENT 
Line 5 

를? 어떻게 수정해야합니까?

+0

꼬리표를 잊어 버렸습니까? 아니면 그냥 오타입니까? – squiguy

+0

@squiguy는 그것을 수정했습니다. 그렇습니다. 오타되었습니다. – MinaHany

+0

Tie :: File 또한 인라인 편집을 조사하는 좋은 모듈입니다. – squiguy

답변

2

텍스트 파일을 읽고 그 부분을 대체 할 수 있다고 생각하지 않습니다. 길거나 짧은 문자열로 원하는 결과를 얻을 수 있습니다. 새 문자열이 길어지면 일부 데이터를 덮어 쓰거나 문자열이 짧으면 "구멍"이 남아있게됩니다. 문자열의 길이가 같으면 논리에 여전히 문제가 있습니다. 문자열을 바꾸려면 문자열을 읽은 후에 바꾸려는 문자열을 지나치므로 백업해야합니다. 그 시점에서 대체물을 쓰는 것은 파일 "포인터"가 현재 다음 줄을 읽을 준비가되어있는 곳이기 때문에 다음 줄을 덮어 써야합니다.

이렇게 생각하면 별개의 출력 파일을 사용하는 것이 가장 좋습니다. 하나를 읽고, 다른 하나를 쓰고, 필요하다면, 첫 번째를 삭제하고 두 번째로 이름을 바꾸십시오.

또는 전체 파일을 배열로 읽고 문자열 바꾸기, 덮어 쓰기를 위해 파일을 닫았다가 다시 열고 배열을 파일에 다시 쓰고 파일을 닫을 수 있습니다.

+0

당신은 겹쳐 쓰고 "구멍"이 생길 것입니다. 별도의 출력 파일 이외의 다른 방법이 있습니까? – MinaHany

+0

전체 파일을 메모리에있는 배열로 읽어 들여 문자열을 바꾼 다음 처음부터 다시 시작하여 동일한 파일에 다시 쓰게됩니다. – Scooter

+0

아 물론! 그것을 배열로 읽는 것이 완벽합니다. 고맙습니다. – MinaHany

관련 문제