2016-08-22 3 views
0

C++ヘッダー専用ライブラリの名前空間をカスタム名前空間に囲んで、シンボル名が顧客コードと衝突しないようにしようとしています。perl - multilineの問題でC++ヘッダーを変更する

ここに私が書いたperlスクリプトです。これは、defネームスペースをabcネームスペースに囲む必要があります。

#!/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; 
} 

、ここで私が使用していますテストファイルされる:

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 def { 
    abc 
} 
namespace def { // some comment 
    do_something(); 
} 
namespace def { 
    do_something(); 
    while (still_not_crashed()) { 
     do_even_more(); 
    } 
} 

とすぐに罰金が、1つのラインの名前空間の作品を生み出します一致するはずのパターンに改行が含まれていますが、私は - 修飾子を正規表現に追加しました。

私は間違っていますか?あなたは、文字列にファイル全体を読み込む必要が

+1

をだからあなたのC++の質問は、あなたのperlスクリプトをデバッグする方法であります? –

+0

私はタグC++を追加しました。なぜなら、いくつかのcppの開発者が同様の状況に遭遇したと思われるからです。それは主に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