2008-10-09 7 views
-1

J'ai la chaîne suivante:Remplacer un astérisque (*) en utilisant l'expression régulière Perl

$_='364*84252';

La question est: comment remplacer * dans la chaîne avec quelque chose d'autre? J'ai essayé s/\*/$i/, mais il y a une erreur: Quantifier follows nothing in regex. D'un autre côté, s/'*'/$i/ ne cause aucune erreur, mais il ne semble pas avoir d'effet du tout.

+0

Le deuxième exemple est la recherche d'un ou plusieurs apostophes, c'est pourquoi cela ne fonctionne pas. Le premier devrait fonctionner, comme indiqué par les réponses données. –

+0

@Brad: Comme actuellement concocté, le '$ i' est dans le RHS; '/ o' n'adresse que la partie de correspondance sur le LHS d'une opération' s /// '. – tchrist

Répondre

8

Autre chose est bizarre ici ...

~> cat test.pl 
$a = "234*343"; 
$i = "FOO"; 

$a =~ s/\*/$i/; 
print $a; 

~> perl test.pl 
234FOO343 

trouvé quelque chose:

~> cat test.pl 
$a = "234*343"; 
$i = "*4"; 

$a =~ m/$i/; 
print $a; 

~> perl test.pl 
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE 4/ at test.pl line 4. 

Solution, échapper aux caractères spéciaux de la variable à l'aide \Q et \E, par exemple (TIMTOWTDI)

~> cat test.pl 
$a = "234*343"; 
$i = "*4"; 

$a =~ m/\Q$i\E/; 
print $a; 

~> perl test.pl 
234*343 
+0

vous pouvez également utiliser quotemeta http://perldoc.perl.org/functions/quotemeta.html –

2
$ perl -le '$_="364*84252";s/\*/xx/;print' 
364xx84252 

fonctionne bien. Peut-être que vous utilisez des guillemets dans une ligne au lieu de guillemets simples? Je ne suis pas sûr - je ne peux pas reproduire vos résultats du tout. Vous devrez donner un peu plus de contexte à votre problème, de préférence avec du code que nous pouvons exécuter pour reproduire vos résultats.

0

L'erreur doit provenir de $i. s/\*/foo/ fonctionne très bien.

2

Ce doit être un problème de psh alors. L'exécution du script avec perl xx.pl ne génère aucune erreur. Merci pour l'aide;)

Les chaînes font leur propre échapper de backslashes. Dans ce cas, vous devriez probablement doubler les antislashs à s/\\*/$i/

+0

Je ne suis pas sûr si vous vouliez dire un backslash quadruple là-bas. Je viens de mettre en forme dans 'Courier', mais je n'ai pas changé votre code. Vous pourriez le revoir si vous avez une chance. – tchrist

+0

@tchrist: Le quadruple était parce que markdown nécessite de citer des barres obliques inverses à l'extérieur des sections de code. Vous devriez les avoir réduites de moitié avant de les mettre dans une telle section ;-) –

+0

Merci. Je n'étais pas sûr des règles de formatage dans markdown. – tchrist

0

essayer

$VARIABLE =~ s/\Q*\E//; 
+1

Dans ce cas, vous n'aurez pas besoin de '\ E ', car rien ne le suit. – tchrist

+0

Je serais bien d'expliquer votre réponse un peu au lieu d'écrire une seule ligne. Cela ressemble plus à un commentaire pour moi ... – MUG4N

1

Mieux encore utiliser

$InputLine =~ s/\Q*\E//g; 

Cela devrait éliminer les astérisques partout dans la chaîne variable.

Questions connexes