6

我有一个 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

谢谢

4

4 回答 4

6

使用双重评估:

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

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

$replace注意 .和ee末尾的双引号s///

于 2012-07-13T11:43:18.943 回答
0

尝试对 regex-sub 进行 eval,警告替换来自外部文件

eval "$test =~ s/$search/$replace/";
于 2012-07-13T11:50:46.960 回答
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) 当然没有什么不好的。

于 2012-07-14T23:39:08.210 回答
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;
于 2012-07-13T12:14:07.293 回答