2016-08-22 2 views
0

고객 이름과 심볼 이름 충돌을 피하기 위해 C++ 헤더 전용 라이브러리의 네임 스페이스를 사용자 정의 네임 스페이스에 묶으려고합니다.perl-multiline 문제가있는 C++ 헤더의 이름 바꾸기

여기 제가 작성한 펄 스크립트입니다. def 네임 스페이스를 abc 네임 스페이스에 묶어야합니다. 잘하지만

namespace abc { 
namespace def {} 
} 
namespace abc { 
namespace def { abc } 
} 
namespace abc { 
namespace def { { } } 
} 
namespace abc { 
namespace def { { abcd } } 
} 
namespace def { 
    abc 
} 
namespace def { // some comment 
    do_something(); 
} 
namespace def { 
    do_something(); 
    while (still_not_crashed()) { 
     do_even_more(); 
    } 
} 

한 라인 네임 스페이스 작업을 가능한 한 빨리 그러나 파일에 스크립트를 실행

namespace def {} 
namespace def { abc } 
namespace def { { } } 
namespace def { { abcd } } 
namespace def { 
    abc 
} 
namespace def { // some comment 
    do_something(); 
} 
namespace def { 
    do_something(); 
    while (still_not_crashed()) { 
     do_even_more(); 
    } 
} 

만 산출 :

#!/usr/bin/perl 

while (<>) { 
    s/namespace\s+def\s* 
    (# group 1 - braced string with balanced number of lbraces and rbraces 
     \{ 
     (# group 2 - String without braces or recursion to group 1 
      [^\{\}]* # some string that does not contain braces 
      | (?1) # recursion of group1 
     )* 
     \} 
    ) 
    /namespace abc {\nnamespace def \1\n}/gcsx; 
    print; 
} 

여기 내가 사용하고있는 testfile 위입니다 일치해야하는 패턴은 내가 정규식에 -modifier를 추가하더라도 작업을 중단하는 개행을 포함합니다.

내가 뭘 잘못하고 있니?

+1

그래서 C++ 질문이 펄 스크립트를 디버깅하는 방법입니다 ? –

+0

나는 몇몇 cpp devs가 유사한 상황을 겪었다 고 생각하기 때문에 C++이라는 태그를 추가했다. 그것은 주로 perl 질문입니다. – Richard

+0

줄 단위로 대체 작업을 수행하므로 여러 줄에서 작동하지 않습니다. – Toto

답변

2

는 그런 다음이 문자열을 대체 할 문자열의 전체 파일을 읽을 수 있습니다

#!/usr/bin/perl 
use Modern::Perl; 

undef$/; 
$_ = <DATA>; 
    s/namespace\s+def\s* 
    (# group 1 - braced string with balanced number of lbraces and rbraces 
     \{ 
     (# group 2 - String without braces or recursion to group 1 
      [^\{\}]* # some string that does not contain braces 
      | (?1) # recursion of group1 
     )* 
     \} 
    ) 
    /namespace abc {\nnamespace def $1\n}/gsx; 
    print; 


__DATA__ 
namespace def {} 
namespace def { abc } 
namespace def { { } } 
namespace def { { abcd } } 
namespace def { 
    abc 
} 
namespace def { // some comment 
    do_something(); 
} 
namespace def { 
    do_something(); 
    while (still_not_crashed()) { 
     do_even_more(); 
    } 
} 

출력 :

namespace abc { 
namespace def {} 
} 
namespace abc { 
namespace def { abc } 
} 
namespace abc { 
namespace def { { } } 
} 
namespace abc { 
namespace def { { abcd } } 
} 
namespace abc { 
namespace def { 
    abc 
} 
} 
namespace abc { 
namespace def { // some comment 
    do_something(); 
} 
} 
namespace abc { 
namespace def { 
    do_something(); 
    while (still_not_crashed()) { 
     do_even_more(); 
    } 
} 
+0

나는 당신의 대답을 보았을 때 실제로 책상 위에 머리를 때렸다. 고마워. 이제 작동합니다. – Richard