使用perl重命名c ++标头 - 多行问题

时间:2016-08-22 14:53:59

标签: regex perl recursive-regex

我试图在自定义命名空间中包含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 \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 - 修饰符添加到我的正则表达式。

我做错了什么?

1 个答案:

答案 0 :(得分: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();
    }
}