#!/usr/bin/perl -w use strict; $_ = '$a ($a (hi) $a) $a (()$a)'; my $re; $re = qr/(?:[^\(\)]*|\((??{$re})\))+/; s/(\($re\))|\$a/$1?$1:'$b'/eg; print; #### my $re; $re = qr/\((?:(?>[^()]*)|(??{$re}))*\)/; s/($re)|\$a/$1?$1:'$b'/eg;