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

| 我想使用Perl在另一个字符串中替换固定的字符串。这两个字符串都包含在变量中。 如果替换后的字符串不可能包含任何正则表达式元字符,则可以执行以下操作:
my $text = \'The quick brown fox jumps over the lazy dog!\'; 
my $search = \'lazy\'; 
my $replace = \'drowsy\'; 

$text =~ s/$search/$replace/; 
las,我希望它适用于任意固定的字符串。例如。这应该使ѭ1保持不变:
my $text = \'The quick brown fox jumps over the lazy dog!\'; 
my $search = \'dog.\'; 
my $replace = \'donkey.\'; 

$text =~ s/$search/$replace/;
而是用
donkey.
代替this3ѭ,因为点与感叹号匹配。 假设变量内容本身未进行硬编码,例如它们可以来自文件,也可以来自命令行,是否有办法引用或标记变量的内容,以使它们在此类替换操作中不解释为正则表达式? 还是有更好的方法来处理固定字符串?最好还是能让我使用类似regex的功能(例如锚或反向引用)?     
已邀请:
$search
移至
quotemeta
my $text = \'The quick brown fox jumps over the lazy dog!\'; 
my $search = quotemeta(\'dog.\'); 
my $replace = \'donkey.\'; 

$text =~ s/$search/$replace/;
不幸的是,这将不允许您使用其他正则表达式功能。如果您有一些想要逃避的功能,也许您可​​以通过第一个“ cleaning”正则表达式或函数来运行
$search
,例如:
my $search = \'dog.\';
$search = clean($search);

sub clean {
  my $str = shift;
  $str =~ s/\\./\\\\\\./g;
  return $str;
}
    
用string10包裹您的搜索字符串,该字符串会引用其中的任何元字符。
$text =~ s/\\Q$search\\E/$replace/;
    
#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;
}
    

要回复问题请先登录注册