Perl替换为变量

时间:2013-09-06 13:18:05

标签: scripting perl regex

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

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

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

但这不起作用。

关于如何解决这个问题的任何想法?为什么会这样?

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

首先,您需要将$sentence复制到$newsentence

$sentence = "hi this is me";

$foo = "me";

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

print $newsentence;

答案 2 :(得分:2)

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

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

$foo = qr/me/;

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

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

您可以在Regexp Quote-Like Operatorsperlop中详细了解qr//

答案 3 :(得分:1)

即使对于小脚本,请“使用严格”和“使用警告”。你的代码片段使用了$ foo和$ newsentence而没有初始化它们,而'strict'会抓住它。请记住,'=〜'用于匹配和替换,而不是赋值。另外请注意,默认情况下Perl中的正则表达式没有单词限制,因此您获得的示例表达式将$ 1设置为'is me','is'匹配'this'的尾部。

假设你试图将字符串从'嗨这是我'转到'嗨这就是你',你需要这样的东西:

my $sentence = "hi this is me";
$sentence =~ s/\bme$/\byou$/;
print $sentence, "\n";

在正则表达式中,'\ b'是单词边界,'$'是行尾。只是做's / me / you /'也会在你的例子中起作用,但是如果你有一个像'这是快活的老我'这样的字符串可能会产生意想不到的效果,这会变成'这是你老了我'。