Perl Regexes - 替换某些匹配实例

时间:2009-12-06 18:21:55

标签: regex perl

我正在尝试替换源文件中的文本 C预处理器工作。我的方法是解析 常量及其值并使用填充哈希数组 他们。我的问题如下:

在源文件中,我有:

#define CONSTANT 10
#define CONSTANT_PLUS_ONE CONSTANT + 1

我使用/^#define\s+(\w.*)\s+.*($key).*/来匹配第二个 但是,当我用s/$2/$defines{$key}/替换时,两者都是 CONSTANT的实例被替换,即

#define CONSTANT 10
#define 10_PLUS_ONE 10 + 1

我是Perl的新手,所以我希望有人可以 指出我正确的方向,或者我是否公然做了 愚蠢的错误。

3 个答案:

答案 0 :(得分:5)

尝试指定字边界:

s/\b$2\b/$defines{$key}/g;

答案 1 :(得分:3)

\w.*将匹配单词字符,然后匹配任何数字的任何字符,这不是您想要的 - 您需要绑定到单词结尾,或者至少确保匹配中的每个字符都是单词字符,例如\w+。所以试试这个:

/^#define\s+(\w+)\s+($key).*/

请参阅perldoc perlre上的特殊字符和匹配类型的完整规范。

答案 2 :(得分:2)

您也可以通过C预处理器运行代码。把它交给STDIN,这样编译器就不会试图变得聪明并且在文件扩展名中读得太多。

cc -E - < <file> > <newfile>

如果这是你做的Perl源代码,它已经有了常量。是的,您可以获得内联的所有性能优势。

use constant PI => 3.14;
use constant CAKE => PI + 1.2345;