Как заменить произвольные фиксированные строки в Perl? - PullRequest
1 голос
/ 19 апреля 2011

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

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 19 апреля 2011

Запустите $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;
}
5 голосов
/ 19 апреля 2011

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

$text =~ s/\Q$search\E/$replace/;
0 голосов
/ 19 апреля 2011
#Replace a string without using RegExp.
sub str_replace {
    my $replace_this = shift;
    my $with_this  = shift; 
    my $string   = shift;

    my $length = length($string);
    my $target = length($replace_this);

    for(my $i=0; $i<$length - $target + 1; $i++) {
        if(substr($string,$i,$target) eq $replace_this) {
            $string = substr($string,0,$i) . $with_this . substr($string,$i+$target);
            return $string; #Comment this if you what a global replace
        }
    }
    return $string;
}
...