我试图将 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();
}
}
单行命名空间工作得很好,但是一旦应该匹配的模式包含换行符,它就会停止工作,即使我将s -修饰符添加到我的正则表达式中。
我究竟做错了什么?