如何从Perl中的插值变量中转义正则表达式元字符?

时间:2010-02-03 13:44:11

标签: perl string replace

我需要创建一个“模糊”功能,在将其写入日志之前替换明文密码。

看起来像这样:

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

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

      return $logline;
}

但是,这当然不起作用。密码字符串中的“$”符号被内插为结束字符,因此没有匹配,因此替换不起作用。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

(为什么不首先将密码保留在日志行之外?)

使用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";

输出:

password$
password is: password$
password is: ********

答案 1 :(得分:2)

在插值字符串中,

\Qquotemeta
\Llc
\llcfirst
\Uuc
\uucfirst
\E→案例/引用修饰符的结尾

因此,这也是一种解决方案。

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

答案 2 :(得分:0)

解决方案当然是使用:

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