使用 perl 重命名空间 c++ header - 多行问题

Renamespacing c++ header with perl - multiline issues

我正在尝试将 c++ header-only 库的命名空间包含在自定义命名空间中,以避免与客户代码发生符号名称冲突。

这是我写的 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 \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();
    }
}

单行命名空间工作得很好,但一旦应匹配的模式包含换行符,它就会停止工作,尽管我将 s-修饰符添加到我的正则表达式中。

我做错了什么?

您必须以字符串形式读取整个文件,然后对该字符串进行替换:

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