2009-12-06 5 views
1

J'essaie de remplacer le texte d'un fichier source par la façon dont fonctionne le préprocesseur C. Mon approche consiste à analyser constantes et leurs valeurs et remplir un tableau de hachage avec eux. Mon problème est le suivant:Perl Regexes - Remplacement de certaines instances de correspondances

Dans le fichier source, j'ai:

#define CONSTANT 10 
#define CONSTANT_PLUS_ONE CONSTANT + 1 

J'utilise /^#define\s+(\w.*)\s+.*($key).*/ pour correspondre à la deuxième ligne , mais quand je remplacerai avec s/$2/$defines{$key}/, sont remplacés deux cas de CONSTANT, à savoir

#define CONSTANT 10 
#define 10_PLUS_ONE 10 + 1 

Je suis quelque chose d'un novice Perl, donc je suis en espérant que quelqu'un peut me diriger dans la bonne direction, ou si je l'ai fait une manière flagrante erreur stupide.

+0

Utilisez-vous/g dans votre regex de remplacement, mais en l'omettant dans votre question? –

Répondre

5

Essayez d'indiquer les limites de mots:

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

Ah, parfait. Je l'avais déjà essayé et certains l'ont gâché. Je vous remercie Dreeves, je pense que je peux dormir maintenant! – Conor

3

\w.*\w.* correspondra à un caractère de mot, puis à un nombre quelconque de caractères, ce qui n'est pas ce que vous voulez - vous devez vous lier aux terminaisons de mots, ou au moins vous assurer que chaque caractère de la correspondance est un caractère par exemple \w+. Donc, essayez ceci:

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

Voir la spécification complète des caractères spéciaux et les types de match à perldoc perlre.

+0

C'est probablement plus robuste mais le problème de Conor était quelque chose de différent, je pense. – dreeves

+0

Je vois ce que vous dites, Ether. C'est un bon point. Je vais modifier cela aussi. Merci pour votre conseil! – Conor

2

Vous pouvez aussi exécuter votre code par le préprocesseur C. Remettez-le en tant que STDIN afin que le compilateur n'essaie pas d'être intelligent et de lire trop dans l'extension de fichier. Et si c'est le code source Perl que vous faites, il a déjà des constantes. Et oui, vous obtenez tous les avantages de performance de l'inline.

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