Как заменить произвольные фиксированные строки в Perl

Я хочу заменить фиксированную строку другой строкой с помощью Perl. Обе строки содержатся в переменных.

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

my $text = 'The quick brown fox jumps over the lazy dog!';
my $search = 'lazy';
my $replace = 'drowsy';

$text =~ s/$search/$replace/;

Увы, я хочу, чтобы это работало для произвольных строк fixed. Например, это должно оставить $text без изменений:

my $text = 'The quick brown fox jumps over the lazy dog!';
my $search = 'dog.';
my $replace = 'donkey.';

$text =~ s/$search/$replace/;

Вместо этого dog! заменяется на donkey., поскольку точка соответствует восклицательному знаку.

Предполагая, что само содержимое переменной не жестко закодировано, например, оно может поступать из файла или из командной строки, есть ли способ заключать в кавычки или иным образом уценивать содержимое переменной, чтобы оно не интерпретировалось как регулярное выражение в таких случаях? операции замены?

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


person thkala    schedule 19.04.2011    source источник


Ответы (3)


Запустите $search через quotemeta:

my $text = 'The quick brown fox jumps over the lazy dog!'; 
my $search = quotemeta('dog.'); 
my $replace = 'donkey.'; 

$text =~ s/$search/$replace/;

К сожалению, это не позволит вам использовать другие функции регулярных выражений. Если у вас есть выбранный набор функций, от которых вы хотите избавиться, возможно, вы можете просто запустить свой $search через первое регулярное выражение или функцию «очистки», например:

my $search = 'dog.';
$search = clean($search);

sub clean {
  my $str = shift;
  $str =~ s/\./\\\./g;
  return $str;
}
person CanSpice    schedule 19.04.2011
comment
+1 Это именно то, что мне было нужно - не знаю, как я это пропустил в perlfunc. - person thkala; 19.04.2011

Оберните строку поиска \Q...\E, которая заключает в кавычки любые метасимволы внутри.

$text =~ s/\Q$search\E/$replace/;
person Sam Choukri    schedule 19.04.2011
comment
+1 Это сработает, хотя я бы предпочел исправить строку поиска, чем вызовы оператора подстановки... - person thkala; 19.04.2011
comment
Оба метода полезны в разных ситуациях. Если бы я действительно хотел изменить строку поиска, я бы использовал quotemeta(). Если бы я не хотел изменять строку поиска, я бы использовал \Q...\E. - person Sam Choukri; 19.04.2011

person    schedule
comment
Вот что он говорит, я просто ссылаюсь (или был) на чей-то код. Это не мое мнение. - person Ry-♦; 19.04.2011