#!perl -l use strict; my @a=("func2(func1(input1, input2), input3)", "func1(input1, func2(input2, input3))"); my $re = ""; $re=qr{\((((?>[^()]+)|(??{ $re }))*)\)}; for my $line (@a) { $line =~ s/func1$re/proc1{$1}/g; $line =~ s/func2$re/FUNC $1 END/g; $line =~ tr/{}/()/; print $line; }