web-dev-qa-db-fra.com

Meilleure façon de supprimer des caractères spécifiques d'une chaîne Perl

J'ai généré dynamiquement des chaînes comme @#@!efq@!#! et je souhaite supprimer des caractères spécifiques de la chaîne à l'aide de Perl.

Actuellement, je fais quelque chose comme ça (remplacer les personnages par rien):

$varTemp =~ s/['\$','\#','\@','\~','\!','\&','\*','\(','\)','\[','\]','\;','\.','\,','\:','\?','\^',' ', '\`','\\','\/']//g;

Existe-t-il une meilleure façon de le faire? Je cherche quelque chose de propre.

18
Ron

Vous avez mal compris comment les classes de caractères sont utilisées:

$varTemp =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/]+//g;

fait la même chose que votre regex (en supposant que vous ne vouliez pas supprimer les caractères ' de vos chaînes). 

Edit: Le + permet à plusieurs de ces "caractères spéciaux" de correspondre en même temps, il devrait donc également être plus rapide.

24
Tim Pietzcker

Vous pouvez utiliser le tr à la place: 

       $p =~ tr/fo//d;

supprimera tous les f et tous les o de $p. Dans votre cas, cela devrait être:

       $p =~ tr/\$#@~!&*()[];.,:?^ `\\\///d
17
ShinTakezou

Avec une classe de personnage aussi grande, il est plus facile de dire ce que vous voulez conserver. Un signe inséré dans la première position d'une classe de caractères change son sens, vous pouvez donc écrire

$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi

ou, en utilisant le plus efficace tr

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd
7
Borodin

Si vous utilisez une chaîne générée aléatoirement de manière à ce qu’elle ait une faible probabilité d’être mise en correspondance avec une chaîne intentionnelle que vous pourriez normalement trouver dans les données, vous voulez probablement une chaîne par fichier. 

Vous prenez cette chaîne, appelez-la $place_older say. Et ensuite, lorsque vous souhaitez éliminer le texte, vous appelez quotemeta , et vous utilisez cette valeur pour substituer: 

my $subs = quotemeta $place_holder;
s/$subs//g;
0
Axeman