2017-12-30 57 views
0

perl 초보자. 필자는 파일의 텍스트를 찾아서 바꾸기 위해 간단한 한 줄짜리 작업을하고 있습니다. \Q\E 또는 quotemeta()으로 모든 특수 문자를 이스케이프 처리하는 방법에 대해 읽었지 만 변수를 보간 할 때만 작동한다는 것을 알았습니다. 예를 들어, 특수 문자가 포함 된 부분을 직접 교체하려고하면 오류가 발생합니다. 하지만 먼저 스칼라에 저장하면 작동합니다. 물론, 모든 특수 문자를 백 슬래시로 이스케이프하면 작동합니다.펄 정규식 직접 이스케이프 특수 문자

$ echo 'One$~^Three' | perl -pe 's/\Q$~^\E/Two/' 
One$~^Three 
$ echo 'One$~^Three' | perl -pe '$Sub=q($~^); s/\Q$Sub\E/Two/' 
OneTwoThree 
$ echo 'One$~^Three' | perl -pe 's/\$\~\^/Two/' 
OneTwoThree 

누구든지이 동작을 설명 할 수 있으며 백 슬래시를 사용하지 않고 직접 특수 문자를 인용 할 수있는 대안이 있는지도 보여 줄 수 있습니까?

+0

, 그래서

"abc" . quotemeta("def" . $ghi . "!jkl") . "mno" 

에 해당합니다. : P –

+0

한 라이너는'use strict','use warnings'과 적절한 변수 선언을 적절한 프로그램 파일보다 제대로 작성하는 것이 훨씬 어렵습니다. 솔직히 한 줄짜리 Perl 프로그램을 작성할 이유가 없다는 것을 제외하고는 리눅스 문화를 배제한 파이프 배쉬 (bash) 명령 체인이 포함되어 있으며 언어 학습을 시작하기에 좋은 곳은 아닙니다. Perl을 파일에 넣고 IDE에서 실행하십시오 : 이해하기 쉽고 디버깅이 훨씬 쉬우 며 나쁜 코딩 습관으로 들어가는 코드가 훨씬 적어지며 코드를 열어 다시 실행할 수 있습니다 필요하다면 – Borodin

답변

1

보간, 먼저 \Q, \U, \u, \L\l 발생합니다.

"abc\Qdef$ghi!jkl\Emno" 

을 의미

백 슬래시가 존재하는 이유입니다, 좋은 대안이없는

s/\Q$~^/Two/ # not ok quotemeta($~ . "^") 
s/\Q$Sub/Two/ # ok 
s/\$\~\^/Two/ # ok 
s/\$\Q~^/Two/ # ok 
+0

그래서 '$'만 있으면 문제가 될까요? '(~ ^'와 같은 다른 특수 문자 시퀀스가 ​​있으면 올바르게 작동합니까? – SigmaPiEpsilon

+0

'@'는 또한 보간을 시작할 수 있습니다. 또한 분리 문자를 이스케이프 처리 할 수 ​​없습니다. – ikegami

+0

그래, 고마워! – SigmaPiEpsilon