使用 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();
}
}
我正在尝试将 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();
}
}