2012-11-01 5 views
1

Je crée un constructeur d'expressions rationnelles. Mais lors de l'exécution:

my $text = 'a a a'; 
my $replace = '$1/$2-$3'; 
$text =~ s/(\w) (\w+) (\w+)/$replace/gmi; 

$ text ici = '1 $/2 $ 3'; Donc, $ 1, $ 2, $ 3 ne sont pas modifiés mais placés comme ils le sont dans $ replace. Comment est-ce que je le ferais utiliser $ remplacer le contenu en tant que modèle de réimpression imprimé manuellement?

+0

Le code fait ce que vous lui dites de faire. Maintenant, que voulez-vous exactement de cela? '$ 1' et' $ 2' n'ont pas de signification particulière si vous l'utilisez comme une valeur de chaîne dans une variable. Ils sont juste une partie de cette chaîne. –

Répondre

4

$replace est juste une chaîne. Si vous voulez qu'il soit évalué comme code, vous avez besoin du modificateur /e dans votre substitution. Mais vous devez aussi préparer votre chaîne pour l'évaluation à interpoler vos variables:

my $replace = 'qq($1/$2-$3)'; 
$text =~ s/(\w) (\w+) (\w+)/$replace/gmiee; 

Nous utilisons deux évaluation d'abord tourner la variable dans une chaîne, puis d'évaluer cette chaîne. Cependant, chaque fois que vous vous appuyez sur eval, vous faites probablement quelque chose d'inutile. Eval peut être plutôt diabolique, comme le souligne OmnipotentEntity, alors faites très attention à l'utiliser.

+1

"Cependant, chaque fois que vous vous reposez sur eval, vous faites probablement quelque chose d'inutile." Ou infâme. – OmnipotentEntity

+0

@OmnipotentEntity En effet. – TLP

+0

Trop de travail. J'ai testé avec/ee mais j'ai oublié de citer $ remplacer le contenu entre guillemets doubles/qq. – elgato