use strict; use warnings; my $data = do {local $/; }; our $braces_re = qr/(\{ (?: (?>[^{}]+) | (?-1) )* \})/x; while ($data =~ /(\{ (?: (?>(?:(?!\bfopen\b)[^{}])+) | (?> $braces_re ) )* \bfopen\b (?: (?>[^{}]+) | (?> $braces_re ) )* \})/xg) { print "'$1'\n"; } __DATA__ void fo { ........ { //first one f = fopen(...); ....... if(...) { } } //mapping one ........ } void bar { ........ { //first one if(...) { for { if { } else { } } f = fopen(...); while { } } ....... if(...) { } } //mapping one ........ }