虽然我会选择解析整个树,但仅使用正则表达式可以解决问题:
use strict; use warnings; use feature qw(say);
my $string = "((A:14,B:43):22,C:76,(D:54,(E:87,F:28):17):35)";
$string =~ s/^\(//;
$string =~ s/\)$//;
$string =~ s{
\G ((?&PRELEM)) : (\d+) (,|$)
(?(DEFINE)
(?<SUBLIST> [(] (?&ELEM)(?:,(?&ELEM))* [)] )
(?<ELEM> (?&PRELEM) : \d+ )
(?<PRELEM> (?:[A-Z]|(?&SUBLIST)) )
)
}{"$1:".($2+10).$3}gex;
say "($string)";
打印((A:14,B:43):32,C:86,(D:54,(E:87,F:28):17):45)
。
我定义了一个自顶向下递归解析的小语法,请根据需要进行调整。在顶层,我们有无趣的 Pre-Elements,我们将其存储在$1
它们可以是单个字母或用括号括起来的树。在 a 之后是:
我们想要增加的数字,存储在$2
. 它后面是字符串或逗号的结尾。我们迭代匹配,从最后一个匹配的左侧开始(由/g
选项和\G
断言表示)。当我们构建替换字符串时会发生添加(我们正在使用该/e
选项)。