我正在尝试替换源文件中的文本 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的新手,所以我希望有人可以 指出我正确的方向,或者我是否公然做了 愚蠢的错误。
答案 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;