2016-02-10 8 views
0

Итак, я работал над скриптом perl, который выполняет команды подстановки на входе, а на входе будут обратные косые черты. Так просто заменить текст с новым текстомЗамена текста на обратную косую черту с помощью команды замены perl

Например, если вход был

"\text" 

Я мог бы выход

"newText" 

Обратите внимание, что слеш удаляется.

Вот код, который делает это:

$oldText = "\\Text"; 

while (<STDIN>) {     
    $ln = $_;      
    $ln2 = $_; 
    $ln2 =~ s/\\Text/newText/; 
    $ln =~ s/$oldText/newText/; 
} 
print "$ln\n"; 
print "$ln2\n"; 

Когда вход «Текст» выход

\newText #Incorrect because the \ is still there 

newText #Correct 

Может кто-нибудь объяснить, почему с помощью строки вместо переменной изменяет выходной быть тем, что я хочу? Я знаю, что \ derefences следующий символ, и это, вероятно, источник проблемы. Но я не могу понять, почему использование переменной меняет результат. Изменение переменной oldText на «\ text» не изменяет результат.

ответ

4

Использование warnings сказал бы вам:

Unrecognized escape \T passed through in regex; marked by <-- HERE in m/\T <-- HERE ext/ at ... 

$oldText = "\\Text" присваивает строку \Text до $ oldText, так что две замены не эквивалентны. Используйте \Q (см. quotemeta), чтобы процитировать содержимое переменной:

$ln =~ s/\Q$oldText/newText/;