7

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

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

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

在替换中,我的意思是 1 美元,然后是 123 号,然后是 2 美元,但不是 1123 美元,然后是 2 美元。正则表达式中的正确替换是什么?我想用一个正则表达式来做。

谢谢。

4

2 回答 2

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 的预期。

使用后视和前瞻断言的另一种方法:

$s =~ s/(?<=id=")(?=")/123/;
于 2012-08-01T15:35:05.373 回答
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"
于 2012-08-01T15:39:15.963 回答