Замена текста обратной косой чертой в переменной в Perl - PullRequest
3 голосов
/ 03 июня 2010

Как заменить обратную косую черту внутри переменной?

$string = 'a\cc\ee';
$re = 'a\\cc';
$rep = "Work";

#doesnt work in variable
$string =~ s/$re/$rep/og;
print $string."\n";

#work with String
$string =~ s/a\\cc/$rep/og;
print $string."\n";

выход:

a\cc\ee
Work\ee

Ответы [ 3 ]

9 голосов
/ 03 июня 2010

Поскольку вы используете это внутри регулярного выражения - вы, вероятно, хотите quotemeta() или \Q и \E (см. perldoc perlre)

perl -E'say quotemeta( q[a/asf$#@ , d] )'

# prints: a\/asf\$\#\@\ \,\ d

# Or, with `\Q`, and `\E`
$string =~ s/\Q$re\E/$rep/og;
print $string."\n";
2 голосов
/ 03 июня 2010

Если вы установите $re = 'a\cc';, это будет работать. Обратная косая черта не интерполируется, как вы ожидаете, когда включаете ее в регулярное выражение в качестве переменной: она используется буквально в подстановке.

В качестве альтернативы вы можете определить строку с двойными кавычками, но это не очень хорошая практика. Лучше всегда использовать одинарные кавычки в ваших строках, если вы явно не хотите интерполировать что-либо в контенте - это экономит ничтожно малую часть обработки, но это подсказка читателю относительно того, что вы, программист, хотели.

0 голосов
/ 03 июня 2010

Проблема в том, что вы используете одинарные кавычки для определения $re. Это означает, что когда вы используете его в шаблоне поиска, он ищет две косые черты.

Одинарные кавычки говорят Perl не интерполировать строки, а использовать вместо них необработанные символы. Каждый слэш воспринимается буквально и как побег.

Сравнить:

$re0 = 'a\\cc';
$re1 = "a\\cc";

Когда вы распечатаете их, вы увидите:

print $re0."\n".$re1."\n";

a\\cc
a\cc

С другой стороны, когда вы используете строку непосредственно в регулярном выражении, она интерполируется, поэтому вам нужен один слеш, чтобы действовать как побег, а другой - как выход, который вы избегаете.

...