我想在两个模式之间插入数字:

$s = 'id="" value="div"';
$s =~ s/(id=")(".*)/$1123$2/;


当然,我得到了错误,结果是“ value =“ div”。
预期结果为id =“ 123” value =“ div”。

在替换中,我的意思是$ 1,然后是数字123,然后是$ 2,但不是$ 1123,然后是$ 2。
正则表达式中正确的替代品是什么?我想在一个正则表达式中做到这一点。

谢谢。

最佳答案

$s =~ s/(id=")(".*)/$1123$2/;  # Use of uninitialized value $1123 in concatenation (.) or string


尽管您希望它代替$1,但perl却将其视为变量$1123。 Perl无法知道您的意思是$1。因此,您需要通过将其指定为$1来将可变性限制为${1}

$s =~ s/(id=")(".*)/${1}123$2/;


在脚本顶部包含以下内容始终是一个好主意。它们将为您节省大量时间和精力。

use strict;
use warnings;


例如,使用上面的模块运行脚本会导致错误消息:

Use of uninitialized value $1123 in concatenation (.) or string at /tmp/test.pl line 7.


(忽略报告的脚本名称和行号。)它清楚地说明了perl期望的内容。

使用后向和先行断言的另一种方法:

$s =~ s/(?<=id=")(?=")/123/;

07-28 00:22