我正在尝试替换字符串中的单词。这个词存储在一个变量中,所以我自然会这样做:
$sentence = "hi this is me";
$foo=~ m/is (.*)/;
$foo = $1;
$sentence =~ s/$foo/you/;
print $newsentence;
但这不起作用。
关于如何解决这个问题的任何想法?为什么会这样?
答案 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 Operators的perlop中详细了解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 /'也会在你的例子中起作用,但是如果你有一个像'这是快活的老我'这样的字符串可能会产生意想不到的效果,这会变成'这是你老了我'。