http://qs1969.pair.com?node_id=682246


in reply to Matching parens on a regex is beating me

perldoc -q matching:

How do I find matching/nesting anything?

This isn't something that can be done in one regular expression, no matter how complicated. To find something between two single characters, a pattern like /x([^x]*)x/ will get the intervening bits in $1. For multiple ones, then something more like /alpha(.*?)omega/ would be needed. But none of these deals with nested patterns. For balanced expressions using (, {, [ or < as delimiters, use the CPAN module Regexp::Common, or see "(??{ code })" in perlre. For other cases, you'll have to write a parser.

That said, for your situation, you can repeatedly find the innermost expression and replace it using a dispatch table:
my %arg_xlate = ( func1 => sub { "proc1{$_[0]}" } , func2 => sub { "FUNC $_[0] END" } ); while (<DATA>) { my $line = $_; 0 while ($line =~ s/(func[12])\(([^()]*)\)/$arg_xlate{$1}($2)/ge); print $line; } __DATA__ func1(input1, func2(input2, input3)) func2(func1(input1, input2), input3)

Caution: Contents may have been coded under pressure.