带有评估修饰符的perl字符串增量数

时间:2018-08-28 06:34:03

标签: perl

我正在尝试增加:

Text_1_string(0)

Text_1_string(1)

,依此类推。 请注意,我只想增加括号中的数字。 我用过:

name =~ s/\(([0-9]+)\)/$1 + 1/e;

但结果是:

Text_1_string1

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

1 个答案:

答案 0 :(得分:1)

它替换了匹配的整个模式,不仅捕获了所有模式。所以您确实需要放回括号

$name =~ s/\(([0-9]+)\)/'('.($1 + 1).')'/e;

由于替换部分被评估为 code ,因此它需要是正常的Perl代码,因此引号和串联以及括号都优先。


要添加,有一些模式不需要放回替换部分:lookahead and lookbehind断言。像普通锚一样,它们都是零宽度断言,因此它们不会消耗他们匹配的东西-您只能“看”

$name =~ s/(?<=\() ([0-9]+) (?=\))/$1 + 1/xe;

后面的外观不能是可变长度的(例如\w+);它只需要固定的字符串模式。

(?<=...)断言括号中的(固定长度)模式(不捕获!)必须在数字之前,而(?=...)断言其括号内的模式必须遵循整个模式匹配。

lookbehind类型的构造\K通常非常有用,它使引擎在字符串中保留与之匹配的内容(而不是“消耗”它);因此它“删除”了之前的匹配项,就像(?<=...)形式

$name =~ s/\(\K ([0-9]+) (?=\))/$1 + 1/xe;

这也更有效。尽管在文档中也将其称为“后视”,但实际上在行为上存在明显的差异。请参阅this post和评论。感谢ikegami的评论。

所有这些都是正面环顾;还有消极的,断言给定的模式一定不是可以使整个事物匹配。

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