#!/usr/bin/env perl use strict; use warnings; my $balpar_re=qr/ ( \( # opening ( (?:[^'"()]++ # Not a ', ", ( or ) - no backtracking |(?:'(?:[^']|\')*?') #' a single quote string |(?:"(?:[^"]|\")*?") #" a double quote string |(?-1) # must be a ( or ) so recurse )*+ # zero or more time - no backtracking \) # closing ) ) /x; my $text=<<'__EOT__'; xfunc1("shouldn't be changed!") func1 (abc,"abc","should,be,changed!"); func1(arg(),narg()); __EOT__ if ($text=~ s{\bfunc1\s*$balpar_re}{newtext}g) { print $text; }; __DATA__