Perl:传递正则表达式搜索并使用变量替换

时间:2012-07-13 11:29:03

标签: regex perl capture

我有一个Perl脚本,它读取正则表达式搜索并替换INI文件中的值。

这很好用,直到我尝试使用捕获变量($ 1或\ 1)。这些用字面上的$ 1或\ 1替换。

任何想法如何让这个捕获功能通过变量传递正则表达式位?示例代码(不使用ini文件)...

$test = "word1 word2 servername summary message";

$search = q((\S+)\s+(summary message));
$replace = q(GENERIC $4);

$test =~ s/$search/$replace/;
print $test;

这导致......

word1 word2 GENERIC $4

不是

word1 word2 GENERIC summary message

感谢

5 个答案:

答案 0 :(得分:6)

使用双重评估:

$search = q((\S+)\s+(summary message));
$replace = '"GENERIC $1"';

$test =~ s/$search/$replace/ee;

请注意$replace末尾的ees///中的双引号。

答案 1 :(得分:0)

尝试将regex-sub置于eval,请注意替换来自外部文件

eval "$test =~ s/$search/$replace/";

答案 2 :(得分:0)

另一个有趣的解决方案是使用预见(?=PATTERN)

您的示例只会替换需要替换的内容:

$test = "word1 word2 servername summary message";

# repl. only ↓THIS↓
$search = qr/\S+\s+(?=summary message)/;
$replace = q(GENERIC );

$test =~ s/$search/$replace/;
print $test;

答案 3 :(得分:0)

如果你喜欢amon的解决方案,我认为“GENERIC $ 1”不是配置(尤其是'$ 1'部分)。在这种情况下,我认为有一个更简单的解决方案,而不使用预测:

$test = "word1 word2 servername summary message";
$search = qr/\S+\s+(summary message)/;
$replace = 'GENERIC';
$test =~ s/$search/$replace $1/;

虽然当然没有什么不好(?= PATTERN)。

答案 4 :(得分:-1)

使用\ 4,而非$ 4。

$ 4在q()中没有特殊含义,RE引擎也没有识别它。

\ 4对RE引擎有特殊意义。