-3

我正在尝试替换字符串中的单词。这个词存储在一个变量中,所以我很自然地这样做:

$sentence = "hi this is me";
$foo=~ m/is (.*)/;

$foo = $1;
$sentence =~ s/$foo/you/;
print $newsentence;

但这不起作用。

关于如何解决这个问题的任何想法?为什么会发生这种情况?

4

4 回答 4

2

您必须替换相同的变量,否则$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;
于 2013-09-06T13:30:34.160 回答
2

您首先需要复制$sentence$newsentence.

$sentence = "hi this is me";

$foo = "me";

$newsentence = $sentence;
$newsentence =~ s/$foo/you/;

print $newsentence;
于 2013-09-06T13:30:42.033 回答
2

Perl 允许您将字符串插入到正则表达式中,正如许多答案已经显示的那样。在字符串插值之后,结果必须是有效的正则表达式。

在您最初的尝试中,您使用了匹配运算符 ,m//它立即尝试执行匹配。您可以在其位置使用正则表达式引用运算符:

$foo = qr/me/;

您可以绑定到该目录或插入它:

$string =~ $foo;
$string =~ s/$foo/replacement/;

您可以在perlopqr//中的Regexp Quote-Like Operators中阅读更多信息。

于 2013-09-30T17:44:39.660 回答
1

即使是小脚本,请“使用严格”和“使用警告”。您的代码片段使用 $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'。

于 2013-09-06T14:31:47.760 回答