如何在Perl中替换任意固定字符串?

时间:2011-04-19 17:39:18

标签: perl string substitution

我想用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 个答案:

答案 0 :(得分:6)

通过quotemeta

运行您的$search
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;
}

答案 1 :(得分:5)

使用\Q...\E包裹您的搜索字符串,引用任何元字符。

$text =~ s/\Q$search\E/$replace/;

答案 2 :(得分:0)

#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;
}