我正在尝试替换字符串中的单词。这个词存储在一个变量中,所以我很自然地这样做:
$sentence = "hi this is me";
$foo=~ m/is (.*)/;
$foo = $1;
$sentence =~ s/$foo/you/;
print $newsentence;
但这不起作用。
关于如何解决这个问题的任何想法?为什么会发生这种情况?
您必须替换相同的变量,否则$newsentence
不会设置并且 Perl 不知道要替换什么:
$sentence = "hi this is me";
$foo = "me";
$sentence =~ s/$foo/you/;
print $sentence;
如果你想保持$sentence
它以前的值,你可以复制$sentence
并$newsentence
执行替换,这将被保存到$newsentence
:
$sentence = "hi this is me";
$foo = "me";
$newsentence = $sentence;
$newsentence =~ s/$foo/you/;
print $newsentence;
您首先需要复制$sentence
到$newsentence
.
$sentence = "hi this is me";
$foo = "me";
$newsentence = $sentence;
$newsentence =~ s/$foo/you/;
print $newsentence;
Perl 允许您将字符串插入到正则表达式中,正如许多答案已经显示的那样。在字符串插值之后,结果必须是有效的正则表达式。
在您最初的尝试中,您使用了匹配运算符 ,m//
它立即尝试执行匹配。您可以在其位置使用正则表达式引用运算符:
$foo = qr/me/;
您可以绑定到该目录或插入它:
$string =~ $foo;
$string =~ s/$foo/replacement/;
您可以在perlopqr//
中的Regexp Quote-Like Operators中阅读更多信息。
即使是小脚本,请“使用严格”和“使用警告”。您的代码片段使用 $foo 和 $newsentence 而不初始化它们,'strict' 会捕捉到这一点。请记住,'=~' 用于匹配和替换,而不是分配。另请注意,Perl 中的正则表达式默认情况下不是单词限制的,因此您得到的示例表达式会将 $1 设置为“is me”,“is”与“this”的尾部匹配。
假设您试图将字符串从“hi this is me”转换为“hi this is you”,您将需要这样的内容:
my $sentence = "hi this is me";
$sentence =~ s/\bme$/\byou$/;
print $sentence, "\n";
在正则表达式中,'\b' 是单词边界,'$' 是行尾。只是做 's/me/you/' 也可以在你的例子中工作,但如果你有一个像'this is merry old me'这样的字符串,它可能会产生意想不到的效果,它会变成'this is yourry old me'。