my $example1 = 'this(is(a(test)))'; foreach (0..4) { print "level $_: '", peel($example1, $_), "'\n"; } print "level -1: '", peel($example1, -1), "'\n"; sub peel { my ($str, $level) = @_; if ($level < 0) { $str =~ /([^\(\)]+)\)+\Z/; return $1; } my $opening = '(?:[^\(]+\(){' . $level . '}'; my $closing = '\){' . $level . '}'; $str =~ /\A$opening(.+?)$closing\Z/; return $1; }