我有一个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
感谢
答案 0 :(得分:6)
使用双重评估:
$search = q((\S+)\s+(summary message));
$replace = '"GENERIC $1"';
$test =~ s/$search/$replace/ee;
请注意$replace
末尾的ee
和s///
中的双引号。
答案 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引擎有特殊意义。