2012-07-13 3 views
6

정규식 검색을 읽고 INI 파일의 값을 바꾼 Perl 스크립트가 있습니다.Perl : 정규식 검색을 통과하고 변수를 사용하여 바꿉니다.

캡처 변수 ($ 1 또는 \ 1)를 사용하려고 시도 할 때까지 제대로 작동합니다. 이것들은 말 그대로 $ 1 또는 \ 1로 대체됩니다.

어떻게하면이 캡처 기능을 통해 변수를 통해 정규식 비트를 전달할 수있는 아이디어가 있습니까? 이 결과

$test = "word1 word2 servername summary message"; 

$search = q((\S+)\s+(summary message)); 
$replace = q(GENERIC $4); 

$test =~ s/$search/$replace/; 
print $test; 

예제 코드 (AN INI 파일을 사용하지 않는) ... ...

word1 word2 GENERIC $4 

하지

word1 word2 GENERIC summary message 

감사

+0

검색 패턴이 성공하지 못하면 검색 패턴 끝에 **! : **가 있지만 문자열에는 없습니다. – tuxuday

+0

죄송합니다. 내 실수로,! : 예 : – andyml73

답변

6

사용을 두 번 평가 :

$search = q((\S+)\s+(summary message)); 
$replace = '"GENERIC $1"'; 

$test =~ s/$search/$replace/ee; 

s/// 끝에 $replaceee의 큰 따옴표를 사용하십시오.

+0

에서 제거해야합니다. 즉, 도움이되지 않는 – andyml73

-1

$ 4가 아닌 \ 4를 사용하십시오.

$ 4는 q()에 특별한 의미가 없으며 RE 엔진도이를 인식하지 않습니다.

4는 RE 엔진에 특별한 의미가 있습니다.

+0

Arkadiy입니다. 추가 평가 단계가 필요합니다. –

+0

오 크립 - 저는 perl이 변수 보간을하고 RE 구문을 적용한다고 생각했습니다 - 제가 틀렸고 변수의 값이 리터럴로 취급됩니다. 그것을 지적 주셔서 감사합니다. – Arkadiy

0

교체가

eval "$test =~ s/$search/$replace/"; 
0

또 다른 흥미로운 솔루션을 (?=PATTERN)

귀하의 예는 다음 것만을 대체 할 모양 이것은 미리를 사용하는 것이 외부 파일에서오고 있음을 경고, 평가에 정규식 서브를 쓰는 시도

$test = "word1 word2 servername summary message"; 

# repl. only ↓THIS↓ 
$search = qr/\S+\s+(?=summary message)/; 
$replace = q(GENERIC); 

$test =~ s/$search/$replace/; 
print $test; 
+0

나는 그것을 더 좋아할지도 모른다. 감사한다. – andyml73

0

amon의 솔루션이 마음에 들면, "일반 $ 1"이 (구성이 아니라고 가정합니다.) especia lly 그것에있는 '$ 1'부분). 이 경우, 내가보기 이것은 미리를 사용하지 않고 더욱 간단한 해결책이 있다고 생각 : (? = PATTERN)에 대해 정말 나쁜 것도 물론이 없다

$test = "word1 word2 servername summary message"; 
$search = qr/\S+\s+(summary message)/; 
$replace = 'GENERIC'; 
$test =~ s/$search/$replace $1/; 

있지만.

관련 문제