2012-07-16 6 views
2

좋아요. 문자열의 첫 번째 항목을 삭제하려고합니다. 즉, "개"라고 말하지만, 파일에는 첫 번째 항목 만 삭제하고 싶습니다. 그래서 파일이 읽으면 :Perl 첫 번째 항목 삭제

개가 행복했다.
개가 달리는 것을 좋아했습니다.

출력은 행복했다

될 것이다.
개가 달리는 것을 좋아했습니다.

나는 다음과 같은 코드가 있습니다

#!/usr/local/bin/perl 

use warnings; 
use strict; 

my $file = $ARGV[0]; 
my $out = $ARGV[1]; 

open (IN, "<$file"); 
open (OUT, ">$out"); 
while(<IN>){ 
    s/dog/ /; 
    print OUT $_; 
} 

close IN; 
close OUT; 

을 그리고 그것은 작동하지만 대신 첫 번째 인스턴스를 repacing, 그것은 단어의 모든 인스턴스를 대체합니다. 모든 인스턴스를 바꾸기 위해 전역 수정 자 g를 사용해야한다고 생각했습니다. 검색하는 문자열의 모든 인스턴스가 대체되는 이유는 무엇입니까? 아마 내가 보지 않을 간단한 오류 일 겁니다.

답변

7

연산자를 평가할 때마다 첫 번째 인스턴스를 대체하고 각 행의 연산자를 평가하므로 각 행의 첫 번째 인스턴스를 바꿉니다. /g을 사용했다면 각 줄에있는 모든 인스턴스를 교체했을 것입니다.

my $seen; 
while (<>) { 
    ++$seen if !$seen && s/dog//; 
    print; 
} 

또는 한 - 라이너

:

perl -pe'++$seen if !$seen && s/dog//;' infile >outfile 

파일을 추가 할 수는 다시 처리하지만, 위보다 표준 및보다 유연한 사용을 허용합니다. 코드와 같은 효과를 얻으려면, 당신은 단지

script.pl infile >outfile 

대신

script.pl infile outfile 
+0

@eckes는, 그래, 내가 질문을 오해 발견하고 분 전을 고정. – ikegami

+0

위대한 작품. 그러나 명확히하기 위해, infile> outfile은 infile outfile과 어떻게 다릅니 까? – user1440061

+0

'script.pl infile outfile'을 사용했다면, 내 코드는'infile'과'outfile'을 모두 입력 파일로 취급 할 것입니다. – ikegami

3

이는 한 줄 달성 할 수 사용해야합니다 :

perl -0777 -pe 's/dog/ /' inputfile > outputfile 

-0777 스위치는 파일을 한 줄로 읽으므로 예상 한대로 대체 작업을 수행합니다. 이 한 줄은 프로그램 파일과 동일합니다 :

$/ = undef; 
$\ = undef; 
while (<>) { 
    s/dog/ /; 
    print; 
} 
2
while (<>) { 
    my $found = s/dog//; 
    print; 
    last if $found; 
} 
print while <>; 
관련 문제