2010-02-03 4 views
1

J'ai besoin de créer une fonction "obscurcissante" qui remplace le mot de passe en texte clair en ligne, avant de l'écrire dans le journal.Comment puis-je échapper des métacaractères d'expression régulière à partir d'une variable interpolée en Perl?

Il ressemble à ceci:

function pass_obscure { 
     my $logline = shift; 
     my $pass = "wer32pass$"; # this password is an example, the real one is received as parameter, or already stored as global value 

     $logline =~ s/$pass/*********/g; 

     return $logline; 
} 

Mais cela, bien sûr, ne fonctionne pas. Le signe '$' dans la chaîne de mot de passe est interpolé en tant que caractère de fin de ligne, donc il n'y a pas de correspondance, et donc le remplacement ne fonctionne pas.

Comment puis-je résoudre ce problème?

Merci.

+0

ok, désolé, déjà résolu. La solution, bien sûr, est d'utiliser: my $ pattern = quotemeta $ pass; $ logline = ~ s/$ motif/********/g; Merci quand même – Alex

+1

duplication possible de [Comment gérer les caractères spéciaux dans une regex Perl?] (Http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a- perl-regex) – daxim

Répondre

7

(Pourquoi ne pas simplement garder le mot de passe de la ligne du journal en premier lieu?)

Utilisation quotemeta:

$pass = "password\$"; 
$logline = "password is: password\$"; 

print "$pass\n"; 
print "$logline\n"; 
$pass_quoted = quotemeta($pass); 

$logline =~ s/$pass_quoted/********/g; 

print "$logline\n"; 

Sorties:

password$ 
password is: password$ 
password is: ******** 
+0

Salut Mikey Merci pour la réponse, je ne l'ai pas vu à temps. En ce qui concerne votre première question - ce n'est pas à moi de décider. Je cours la commande, qui inclut le mot de passe, et je l'enregistre. Donc, avant de connecter la commande, je veux remplacer le mot de passe par des étoiles. :-) Merci – Alex

+0

Oui, pensé qu'il y avait une raison logique :) – MikeyB

0

ok, désolé, déjà résolu. La solution, bien sûr, est d'utiliser:

my $pattern = quotemeta $pass; 
    $logline =~ s/$pattern/********/g; 

Merci quand même

2

Dans les chaînes interpolées,

\Qquotemeta
\Llc
\llcfirst
\Uuc
\uucfirst
\E → fin de l'affaire/modificateur de citation

Ainsi c'est aussi une solution.

$logline =~ s/\Q$pass/********/g;