2009-12-06 6 views
1

C 사전 처리기가 작동하는 방식과 비슷하게 원본 파일의 텍스트를 바꿀려고합니다. 내 접근 방식은 상수와 그 값을 구문 분석하고 해시 배열을 으로 채 웁니다. ,Perl Regexes - 특정 일치 항목 바꾸기

#define CONSTANT 10 
#define CONSTANT_PLUS_ONE CONSTANT + 1 

내가 두 번째 라인에 맞게 /^#define\s+(\w.*)\s+.*($key).*/를 사용하지만, 내가 s/$2/$defines{$key}/로 교체 할 때, 상수의 두 인스턴스가 교체 : 소스 파일에서

내가 가진, 다음과 같이 내 문제입니다 즉

#define CONSTANT 10 
#define 10_PLUS_ONE 10 + 1 

나는 펄 초보자의 뭔가, 그래서 누군가가 올바른 방향으로 날 지점 수 바라고, 또는 나는 노골적으로,369했습니다 경우어리석은 실수.

+0

대체 정규 표현식에서/g를 사용하고 있지만 질문에서 생략하고 있습니까? –

답변

5

시도 지정 단어 경계 :

s/\b$2\b/$defines{$key}/g; 
+0

아, 완벽합니다. 나는 이것을 이미 시험해 보았고 그것을 어지럽 혔다. 고맙습니다. 나는 지금 잠잘 수 있다고 생각합니다! – Conor

3

\w.*은 단어 문자와 원하는 단어가 일치하지 않을 수 있습니다. 단어 끝 문자에 바인딩해야하거나 일치하는 모든 문자가 단어 문자인지 확인해야합니다. 예 \w+. 따라서 다음을 시도하십시오 :

/^#define\s+(\w+)\s+($key).*/ 

perldoc perlre에 특수 문자 및 일치 유형의 전체 사양을 참조하십시오.

+0

이것은 아마도 더 강력 할 것입니다.하지만 Conor가 가진 문제는 다른 것 같습니다. – dreeves

+0

나는 당신이 말하는 것을 봅니다, 이더. 그건 좋은 지적이야. 나는 이것을 고쳐 줄 것이다. 귀하의 조언에 감사드립니다! – Conor

2

또한 단지 C 프리 프로세서를 통해 코드를 실행할 수 있습니다. STDIN으로 넘겨 주면 컴파일러는 똑똑해지고 파일 확장자를 너무 많이 읽지 않습니다.

cc -E - < <file> > <newfile> 

그리고이 코드를 Perl 소스 코드로 사용하고 있다면 이미 상수가 있습니다. 그리고 네, 인라이닝의 모든 성능 이점을 얻을 수 있습니다.

use constant PI => 3.14; 
use constant CAKE => PI + 1.2345; 
관련 문제