Как я могу избежать метасимволов регулярных выражений из интерполированной переменной в Perl? - PullRequest
1 голос
/ 03 февраля 2010

Мне нужно создать «скрывающую» функцию, которая заменяет текстовый пароль в строке перед записью его в журнал.

Это выглядит так:

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 ]

7 голосов
/ 03 февраля 2010

(Почему бы просто не сохранить пароль в строке журнала?)

Использование 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: ********
2 голосов
/ 04 февраля 2010

В интерполированных строках

\Qquotemeta
\Llc
\llcfirst
\Uuc
\uucfirst
\E → конец регистра / модификатор кавычки

Таким образом, это тоже решение.

$logline =~ s/\Q$pass/********/g;
0 голосов
/ 03 февраля 2010

Решение, конечно, заключается в использовании:

  my $pattern = quotemeta $pass;
  $logline =~ s/$pattern/********/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...