带求值修饰符的字符串中的perl增量数

带求值修饰符的字符串中的perl增量数,perl,Perl,我试图增加: Text_1_string(0) 到 等等。 注意,我只想增加括号中的数字。 我用过: name =~ s/\(([0-9]+)\)/$1 + 1/e; 但事实证明: Text_1_string1 我不明白为什么。捕获的组是数字,不应替换括号 它取代了它匹配的整个模式,而不仅仅是捕获的模式。所以你需要把帕伦夫妇放回去 $name =~ s/\(([0-9]+)\)/'('.($1 + 1).')'/e; 因为替换部分是作为代码计算的,所以它需要是普通的Perl代码,因此引号

我试图增加:

Text_1_string(0)

等等。 注意,我只想增加括号中的数字。 我用过:

name =~ s/\(([0-9]+)\)/$1 + 1/e;
但事实证明:

Text_1_string1

我不明白为什么。捕获的组是数字,不应替换括号

它取代了它匹配的整个模式,而不仅仅是捕获的模式。所以你需要把帕伦夫妇放回去

$name =~ s/\(([0-9]+)\)/'('.($1 + 1).')'/e;
因为替换部分是作为代码计算的,所以它需要是普通的Perl代码,因此引号和串联以及括号是优先的


另外,还有一些模式不需要放回替换部分:断言。像普通的锚一样,这些都是零宽度断言,因此它们不使用它们匹配的内容——您只“看”

这也更有效。虽然它在文档中也被称为“lookback”,但实际上在行为上存在明显的差异。请参阅和评论。谢谢你的评论

所有这些都是积极的环顾四周;也有一些消极的观点,认为给定的模式不应该存在以使整个事物匹配

在这种情况下有点过火,但在其他一些情况下却是真正的礼物。

@susdu欢迎光临,不要着急:)。另外,一种独特的方式是使用“lookarounds”来创建不被替换的模式。例如,
s/(?Re“捕获的组是数字,它不应该替换括号。”,匹配包括paren,因此paren被替换。
$name =~ s/\(([0-9]+)\)/'('.($1 + 1).')'/e;
$name =~ s/(?<=\() ([0-9]+) (?=\))/$1 + 1/xe;
$name =~ s/\(\K ([0-9]+) (?=\))/$1 + 1/xe;