我想在两种模式之间插入数字:
$s = 'id="" value="div"';
$s =~ s/(id=")(".*)/$1123$2/;
当然我得到了错误,结果是 “value =”div“ 。 预期结果为 id =“123”value =“div” 。
在替换中,我的意思是1美元,然后是123,然后是2美元,但不是1123美元,而是2美元。 正则表达式中正确的替换是什么?我想在一个正则表达式中完成。
感谢。
答案 0 :(得分:16)
$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的预期。
使用look-behind和look-ahead断言的另一种方法:
$s =~ s/(?<=id=")(?=")/123/;
答案 1 :(得分:1)
另一种变体:
$s =~ s/(id=")(".*)/$1."123".$2/e;
用法示例:
$ cat 1.pl
$s = 'id="" value="div"';
$s =~ s/(id=")(".*)/$1."123".$2/e;
print $s,"\n";
$ perl 1.pl
id="123" value="div"