sub e1 { shift() *2; } sub e2 { shift() + shift(); } $a = "12.2424.4812367"; $a =~ s/((?:\d+(?:\.\d+)?))((??{e1($+)}))/e2($1, $2)/ge; print $a;