2008-11-21 6 views
1

Perl 스크립트에 문제가 있습니다. 파일의 내용을 수정 한 다음 다시 열어서 작성하고 일부 문자가 손실됩니다. '%'로 시작하는 모든 단어가 파일에서 삭제됩니다. % 식은 대화 상자의 변수 자리 표시 자이므로 매우 귀찮습니다.왜 내 Perl 스크립트가 파일에서 문자를 제거합니까?

이유가 궁금하십니까?

undef $/; 
open F, $file or die "cannot open file $file\n"; 
my $content = <F>;           
close F;              

$content =~s{status=["'][\w ]*["']\s*}{}gi; 

printf $content; 

open F, ">$file" or die "cannot reopen $file\n";    
printf F $content;           
close F or die "cannot close file $file\n"; 

답변

26

당신이 printf을 사용하고 있고 그것의 첫 번째 인수는 형식 문자열이라고 생각 : 소스 파일은 기본 인코딩 여기

있는 XML 코드입니다. 자세한 내용은 printf documentation을 참조하십시오. 이런 종류의 문제가 생기면 항상 함수를 올바르게 사용하고 있는지 확인합니다. :)

당신은 아마 print합니다 : 귀하의 대체하지 크로스 라인 않기 때문에

당신의 예에서
print FILE $content; 

, 당신은 전체 파일을 읽을 필요가 없습니다. 이것은 또한이 명령 줄 프로그램에 감소

open my($in), "<", $file  or die "cannot open file $file\n"; 
open my($out), ">", "$file.bak" or die "cannot open file $file.bak\n"; 

while(<$in>) 
    { 
    s{status=["'][\w ]*["']\s*}{}gi; 
    print $out; 
    } 

rename "$file.bak", $file or die "Could not rename file\n"; 

:

% perl -pi.bak -e 's{status=["\']\\w ]*["\']\\s*}{}g' file 
4

어 대신 읽고 한 번에 같은 파일 이름에 쓰기를 시도의 임시 파일을 사용합니다. 당신은 printf를 사용하고 있습니다.

printf는 "%"를 특별한 것으로 해석합니다.

대신 "인쇄"를 사용하십시오. 당신의 printf를 사용하는 경우

,

printf "%s", $content; 

중요 정보를 사용

PRINTF는

fprintf와는이다 C.에서와 마찬가지로, 인쇄 형식을 의미합니다 파일 I/O에서 C와 동일합니다.

펄이 매개 변수를 1로 콘텐츠를 넣는 것은 보안상의 이유로 총에 맞은,

심지어 C IN C.

없습니다.

0

심지어

perl -i bak -pe 's{status=["\'][\w ]*["\']\s*}{}gi;' yourfiles 

-e는 "사용자가 실행하는 코드는 다음과 같은있다"라고

-i 박

-p가 추가 "whatever.bak하기 이전 파일의 이름을 바꿉니다"라는 -e 코드 주위의 읽기 - 인쇄 루프

Perl 한 줄은 강력한 도구이므로 많은 어려움을 줄일 수 있습니다.

+0

아니요, -i bak는 "이전 파일의 이름을 whateverbak"으로 변경합니다. 박은 ~i. 박 – ysth

0

문서의 XML 성격을 알고있는 솔루션을 원한다면 (예 :단지 당신은 또한 사용할 수있는) 상태 속성을 삭제하고 텍스트 내용이 일치하지 않는 XML::PYX : 대신 인쇄의 printf를 사용하고 당신이 당신을 생각하기 때문에 printf와는 "%"를 (인쇄되지 않습니다 알고 있기 때문이다

$ pyx doc.xml | perl -ne'print unless /^Astatus/' | pyxw 
0

"%%"로 명시 적으로 언급하지 않는 한 % s, % f 등의 형식 기호를 입력하는 것을 잊었습니다. :-)

관련 문제