#!perl -w use strict; my $searchString = '$a'; my $replaceString = '$b'; my $string = '$a($a hi) $a (($a))$a'; # get positions of chars to care about my @aPos = &GetCharPositions($string, $searchString);; my @lparants = &GetCharPositions($string, '('); my @rparants = &GetCharPositions($string, ')'); print "String: $string\n"; print "LeftP: @lparants\n"; print "RightP: @rparants\n"; die "Error: non equal paranthesis found\n" if ($#lparants != $#rparants); print "@aPos\n"; # filter stuff between parantheses foreach my $i (0..$#lparants){ @aPos = grep { $_ < $lparants[$i] or $_ > $rparants[$i] } @aPos; print "AP: @aPos\n"; } # do replacement of stuff still in @aPos foreach (@aPos){ substr($string, $_, length($searchString)) = $replaceString; print "S: $string\n"; } # ------------------------------------------------------------ sub GetCharPositions { my ($string, $subString) = @_; my @list = (); my $startPos = -1; my $pos; while ( defined ($pos = index($string, $subString, $startPos+1))){ last if $pos == -1; $startPos = $pos; push (@list, $pos); } return (@list); } # GetCharPositions # ----------------------------------------------------